如何避免Python模块系统中的命名冲突?

6 投票
1 回答
686 浏览
提问于 2025-04-17 06:31

在我的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测试工具导入了nose.plugins.prof(虽然这个插件是关闭的),然后又导入了hotshot,而hotshot又试图导入profile。但是,profile是从我的项目中导入的,而它本应该是从系统的Python中导入。

显然,我自己的profile模块和系统的profile模块发生了冲突。我显然不能把Python自带的每个模块名都排除在我的编程之外。那么接下来我该怎么办呢?我需要为我的所有应用创建一个myproject的命名空间吗?Django能这样工作吗?

附注:表名hotshot_profile似乎是因为与我项目中使用的pybb里的Profile类发生了命名冲突,但这不在这个问题的范围内。

1 个回答

5

你绝对不应该用 import mymodule 这种方式来导入你自己写的模块(这种叫相对导入)。你应该始终使用 import myproject.mymodule 这种方式(叫绝对导入)。这样可以避免名字冲突的问题。

撰写回答