导入pkg.__init__替代import pkg的文档化行为与差异探究
单模块转包的导入陷阱:
distributed vs distributed.__init__ 需要明确的是,本文并非建议直接导入pkg.__init__,而是为了梳理将单模块发行版转换为包时的潜在陷阱——当前类型规范无法为单模块发行版捆绑静态类型信息。
项目结构转换对比
原单模块结构:
project/ distributed.py
转换为包结构后:
project/ distributed/ __init__.py
第三方用户的导入方式
部分第三方用户可能会执行以下导入操作:
import distributed.__init__ # 和/或 import distributed.__init__ as distributed
已知导入行为差异
distributed和distributed.__init__均会出现在sys.modules中。distributed.__init__会运行两次,Python会为每次运行创建不同的模块对象,因此sys.modules["distributed"] is not sys.modules["distributed.__init__"],且distributed.__init__内直接定义的多数对象在两个模块版本间身份不相等。
待补充的差异与参考
现寻求distributed与distributed.__init__的其他行为差异(如可用__dunder__名称差异、相对导入行为差异),以及相关官方参考或CPython源码中的对应说明。
注:不讨论包类型信息的替代方案,如分发单个
.pyi存根或发布至typeshed,此类方案已了解。
内容的提问来源于stack exchange,提问作者dROOOze
相关产品推荐
相关产品推荐

