Python 中包的相对导入与命名空间包详解
1. 包中相对导入的陷阱
在 Python 里,相对导入并非总是最佳选择。绝对导入(即使用完整路径指定包),在 Python 2.x 的隐式相对导入以及 Python 2.x 和 3.x 的显式点号语法相对导入中,依旧是更受青睐的方案。
虽起初这似乎不太重要,但当你开始编写自己的包时,很快能体会其重要性。Python 3.x 的相对导入语法和默认的绝对搜索规则,强制在包内进行显式导入,使代码更易读和理解,还能在命名冲突场景中明确选择。不过,这种模式有两个主要后果:
- 在 Python 3.x 和 2.x 中,使用包的相对导入指令会隐式地将文件与包目录和角色绑定,限制了文件的其他用途。
- 在 Python 3.x 中,相对搜索规则的改变,让文件难以像 2.x 版本那样同时作为脚本模块和包模块使用。
这些限制的原因如下:
- Python 3.x 和 2.x 都不允许使用相对指令 from . ,除非导入文件是包的一部分。
- Python 3.x 在导入时,除非使用相对指令 from . ,或者模块位于当前工作目录或主脚本的主目录,否则不会搜索包模块的自身目录。
使用相对导入会带来一些问题,比如无法创建既作为可执行程序又能从外部导入的包,部分文件也不能同时作为脚本模块和包模块。在导入指令方面,规则如下:
from . import mod # 在无包模式下,Python 2.x 和 3.x 均不允许
import mod
超级会员免费看
订阅专栏 解锁全文
2577

被折叠的 条评论
为什么被折叠?



