何时使用绝对导入
我正在更改一堆旧的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
-
尽管相对导入很长时间以来都是默认行为,但事实证明这是一个非常糟糕的主意。您可以在此站点上找到很多问题,其中有人只是用内置模块命名文件,并用奇怪的错误消息破坏了他们的应用程序。
这就是为什么通过在 各处 引用您的项目(包括程序包)来进行绝对导入始终是一件好事的原因。
简而言之,请使用以下样式:
import myproject.mypackage from myproject.mypackage.myfile import MyClass
从PEP8引用:
强烈建议不要将相对进口用于包装内进口。始终对所有导入使用绝对包路径。即使现在PEP
328已在Python
2.5中完全实现,仍不鼓励使用其显式相对导入的样式。绝对导入更具可移植性,通常更具可读性。