为何PEP328称绝对导入可实现相对(包内)导入的所有功能?
PEP328 绝对导入相关表述含义解释
首先引用你提到的原文表述:
绝对导入可实现相对(包内)导入的所有功能,尽管代价是重命名层级更高的包组件或将一个包移入另一个包时会更困难
我们可以拆分两部分理解:
1 绝对导入能覆盖相对导入的全部使用场景
相对导入的核心作用是在同一个包的内部,不同层级的模块之间不需要写完整的顶层路径就能互相导入,这类场景用绝对导入完全可以实现。
举个实际的包结构示例:
my_package/ __init__.py module_a.py subpackage/ __init__.py module_b.py
- 如果在
module_b中要导入同目录下的module_c,相对导入写法是from . import module_c,对应绝对导入写法是from my_package.subpackage import module_c,导入效果完全一致 - 如果在
module_b中要导入上层目录的module_a,相对导入写法是from .. import module_a,对应绝对导入写法是from my_package import module_a,效果也完全一致
不存在相对导入能完成、但绝对导入做不到的包内导入需求,这就是前半句话的含义。
2 绝对导入的代价是包结构灵活性降低
绝对导入是硬编码了从顶层包开始的完整导入路径,一旦上层包结构变动,所有相关的导入语句都要手动修改,具体对应两种场景:
- 重命名上层/顶层包:如果你后续要把示例中的顶层包
my_package重命名为official_package,那么项目中所有from my_package import xxx格式的绝对导入语句,都要逐一修改为新的包名,项目规模越大修改成本越高。如果用的是相对导入,整个包改名后内部的所有导入语句不需要做任何调整就能正常运行。 - 迁移子包到其他包下:如果你后续要把示例中的
subpackage整个移动到另一个顶层包third_package下,那么subpackage内部所有写死了my_package路径的绝对导入都会直接报错,必须全部修改为匹配新父包的路径。如果用的是相对导入,只要子包内部的层级结构不变,迁移后所有导入语句都能正常生效。
内容的提问来源于stack exchange,提问作者NeoZoom.lua
相关产品推荐
相关产品推荐

