5.2.2. 命名空间包
命名空间包是由多个 部分 构成的,每个部分为父包增加一个子包。 各个部分可能处于文件系统的不同位置。 部分也可能处于 zip 文件中、网络上,或者 Python 在导入期间可以搜索的其他地方。 命名空间包并不一定会直接对应到文件系统中的对象;它们有可能是无实体表示的虚拟模块。
命名空间包的 __path__
属性不使用普通的列表。 而是使用定制的可迭代类型,如果其父包的路径 (或者最高层级包的 sys.path
) 发生改变,这种对象会在该包内的下一次导入尝试时自动执行新的对包部分的搜索。
命名空间包没有 parent/__init__.py
文件。 实际上,在导入搜索期间可能找到多个 parent
目录,每个都由不同的部分所提供。 因此 parent/one
的物理位置不一定与 parent/two
相邻。 在这种情况下,Python 将为顶级的 parent
包创建一个命名空间包,无论是它本身还是它的某个子包被导入。
另请参阅 PEP 420 了解对命名空间包的规格描述。