如何避免 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 模块系统中的命名冲突?的主要内容,如果未能解决你的问题,请参考以下文章

Python 学习入门(35)—— 模块

如何使用标准库包名称解决 Python 包中的命名空间冲突?

python命名规范

AngularJS 中的模块和命名空间/名称冲突

9-高级语法-包

Python 包管理