导入Python命名空间包时是否会导入目录内模块?相关疑问求解
Python命名空间包导入相关疑问解答
一、导入命名空间包时是否会导入目录中的模块?
- 不会。不管是无
__init__.py的隐式命名空间包,还是带__init__.py的常规包,仅执行import packB这类导入包本身的操作,都不会自动导入包目录下的子模块或子包。 - 只有显式导入子模块(比如
import packB.module1),或者在常规包的__init__.py中提前编写导入语句(比如from . import module1),对应的子模块才会被导入。
二、关于无__init__.py的包导入效果的矛盾解释
你看到的资料说法并非错误,但它针对的是Python 3.3之前的版本:
- 在Python 3.3引入PEP 420规范前,不存在“隐式命名空间包”的概念,无
__init__.py的目录不会被识别为合法包,执行import packB会直接报错。 - Python 3.3及之后,PEP 420新增了隐式命名空间包特性:
- 此时无
__init__.py的同名目录可以被识别为命名空间包,import packB会创建对应的命名空间包对象,但依然不会自动导入目录内的模块。 - 这种设计的核心目的是让分散在不同路径下的同名包目录内容合并到同一命名空间,比如两个不同路径下的
packB,一个包含moduleA.py,另一个包含moduleB.py,导入packB后,你可以通过packB.moduleA和packB.moduleB访问这两个模块(需显式导入)。
- 此时无
简单来说,资料描述的是旧版本规则,你了解到的是Python 3.3+的新特性,两者适用场景不同,不存在冲突。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

