Python 包导入规范 | Google 官方最佳实践
包
Tip
使用每个模块的完整路径名来导入模块。
优点:
避免模块名冲突,或是因模块搜索路径与作者的想法不符而导入错误的包。
也更容易找到模块。
缺点:
部署代码更难,因为你必须完整复刻包的层次。
在现代的部署模式下不再是问题。
结论:
所有新的代码都应该用完整包名来导入每个模块。 应该像下面这样导入:
正确:
## 在代码中引用完整名称 absl.flags (详细版).
import absl.flags
from doctor.who import jodie
_FOO = absl.flags.DEFINE_string(...)
## 在代码中仅引用模块名 flags (常见情况).
from absl import flags
from doctor.who import jodie
_FOO = flags.DEFINE_string(...)
错误: (假设当前文件和 jodie.py 都在目录 doctor/who/ 下)
## 没有清晰地表达作者想要导入的模块和最终导入的模块.
## 实际导入的模块取决于由外部环境控制的 sys.path.
## 那些名为 jodie 的模块中, 哪个才是作者想导入的?
import jodie
不能臆测 sys.path 包含主程序所在的目录,即使这种环境的确存在。
因此,代码必须认定 import jodie 表示的是名为 jodie 的第三方库或者顶层的包,而非当前目录的 jodie.py。