何时使用绝对导入

17 python import

我正在改变一堆旧的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
Run Code Online (Sandbox Code Playgroud)

包中的每个import语句应该是这样的:

import package.subX.moduleX
Run Code Online (Sandbox Code Playgroud)

要么

from package.subX import moduleX
Run Code Online (Sandbox Code Playgroud)

在子包__init__.py文件中怎么样?简单地说是不对的

import moduleA
import moduleB
Run Code Online (Sandbox Code Playgroud)

或者,在/package/subA/moduleA.py中,简单地放入是不对的:

import moduleB
Run Code Online (Sandbox Code Playgroud)

Joc*_*zel 21

相对进口证明是一个非常糟糕的主意,即使它们是长期的默认行为.你可以在这个网站上找到很多问题,有些人只是在内置模块后命名他们的文件,并用奇怪的错误信息打破了他们的应用程序.

这就是为什么通过在任何地方引用您的项目(包括包)来进行绝对导入总是一件好事.

简而言之,使用这种风格:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass
Run Code Online (Sandbox Code Playgroud)

PEP8引用:

不鼓励进行包装内进口的相对进口.始终对所有导入使用绝对包路径.即使现在PEP 328已经在Python 2.5中完全实现,但它的显式相对导入风格仍然是不鼓励的; 绝对导入更便携,通常更具可读性.

  • 截至9月213日,这个答案是错误的,因为PEP8已经改变了.例如:"但是,显式相对导入是绝对导入的可接受替代方法,尤其是在处理复杂的包布局时,使用绝对导入会不必要地冗长" (14认同)
  • +1绝对导入,很容易看到你会得到什么. (2认同)