使用每个模块的完整路径名来导入模块.
优点:
避免模块名冲突, 或是因模块搜索路径与作者的想法不符而导入错误的包. 也更容易找到模块.
缺点:
部署代码更难, 因为你必须完整复刻包的层次. 在现代的部署模式下不再是问题.
结论:
所有新的代码都应该用完整包名来导入每个模块.
应该像下面这样导入:
正确:
# 在代码中引用完整名称 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.