我正在改变一堆旧的python代码,偶尔会遇到包之间的名称冲突。我有一个关于何时应该使用绝对导入以及是否适合仅按名称导入同级模块的问题。
/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py
包中的每个import语句都应该如下:
import package.subX.moduleX
或
from package.subX import moduleX
在子包__init__.py
文件中怎么做?简单地说
import moduleA
import moduleB
或者,在/package/subA/moduleA.py中,简单地放一下是不对的:
import moduleB
答案 0 :(得分:22)
相对导入结果是一个非常糟糕的主意,即使它们是长期的默认行为。你可以在这个网站上找到很多问题,有些人只是在内置模块后命名他们的文件,并用奇怪的错误信息打破了他们的应用程序。
这就是为什么通过引用你的项目到处(包括包)来进行绝对导入总是一件好事。
简而言之,请使用以下风格:
import myproject.mypackage
from myproject.mypackage.myfile import MyClass
引自PEP8:
包装内进口的相对进口量很高 泄气。 始终对所有导入使用绝对包路径。 即使现在PEP 328已在Python 2.5中完全实现, 其积极的相对进口风格受到积极劝阻; 绝对导入更具可移植性,通常更具可读性。