如何避免 Python 模块系统中的命名冲突?
Posted
技术标签:
【中文标题】如何避免 Python 模块系统中的命名冲突?【英文标题】:How do I avoid naming ***es within Python's module system? 【发布时间】:2011-12-31 13:20:55 【问题描述】:在我的 Django 项目中,我有一个名为 profile
的应用程序,它主要包含我的 profile.models.UserProfile
类,以获取有关 User
对象的更多信息(对于 Django 人来说可能看起来很熟悉)。现在我将一些初始化代码放入profile/__init__.py
(一些信号)并遇到了一个问题:Django 告诉我尚未找到名为hotshot_profile
的表。
经过数小时的搜索,我将问题追溯到导入订单。运行python -v manage.py test
我发现了以下内容:
import nose.plugins.prof # precompiled from /home/rassie/.virtualenvs/myproject/lib/python2.6/site-packages/nose/plugins/prof.pyc
import hotshot # directory /usr/lib64/python2.6/hotshot
import hotshot # precompiled from /usr/lib64/python2.6/hotshot/__init__.pyc
dlopen("/home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so", 2);
import _hotshot # dynamically loaded from /home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so
import hotshot.stats # from /usr/lib64/python2.6/hotshot/stats.py
import profile # directory /home/rassie/MyProject/apps/profile
import profile # precompiled from /home/rassie/MyProject/apps/profile/__init__.pyc
所以我的鼻子跑步者导入nose.plugins.prof
(即使这个插件已关闭),导入hotshot
,它试图导入profile
。但是,profile
是从 我的项目 导入的,而它应该是从系统 Python 导入的。
显然,我自己的profile
模块与系统profile
模块发生冲突。我显然不能从我自己的编程中排除与 Python 捆绑在一起的每个模块名称。所以问题是,我从这里去哪里?我是否必须为我的所有应用程序创建一个 myproject
命名空间? Django 会使用它吗?
PS:表的名称hotshot_profile
似乎来自与pybb
中的Profile
类的进一步尚未完全分析的命名冲突,我也在我的项目中使用它。但这超出了这个问题的范围。
【问题讨论】:
【参考方案1】:您永远不应该以import mymodule
(相对导入)的形式导入您自己的模块。相反,您应该始终使用 import myproject.mymodule
(绝对导入)。这样可以避免所有名称冲突。
【讨论】:
我一直认为我已经按照我能找到的关于 Django 的所有建议使用了绝对导入。看来我需要将我的应用程序放入命名空间,然后放入全局路径并按照您的说法导入它们。我们会看看这是否顺利:)以上是关于如何避免 Python 模块系统中的命名冲突?的主要内容,如果未能解决你的问题,请参考以下文章