93、Python 中包的相对导入与命名空间包详解

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      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值