何时使用绝对导入

19 投票
1 回答
17786 浏览
提问于 2025-04-16 16:33

我正在修改一些旧的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 package.subX.moduleX

或者

from package.subX import moduleX

在子包的__init__.py文件中呢?直接写

import moduleA
import moduleB

或者在/package/subA/moduleA.py中,直接写:

import moduleB

1 个回答

25

相对导入其实是个很糟糕的主意,尽管它们曾经是默认的做法。你可以在这个网站上找到很多问题,都是因为有人把自己的文件命名成了内置模块的名字,结果导致应用程序出现奇怪的错误信息。

所以,最好是使用绝对导入,也就是在任何地方都要提到你的项目,包括包的部分。

简单来说,使用这种风格:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass

引用自 PEP8

对于包内的相对导入,强烈不推荐使用。 所有导入都应该使用绝对包路径。 即使现在 PEP 328 在 Python 2.5 中已经完全实现, 这种明确的相对导入风格仍然不被推荐; 绝对导入更具可移植性,通常也更易读。

撰写回答