Python 3.3 中的命名空间包
1. 命名空间包的创建
当搜索路径扫描结束后,若未按步骤 1 或 2 返回模块或包,且步骤 3 中至少记录了一个目录,就会创建命名空间包。命名空间包的创建是即时的,不会延迟到后续的导入操作。新创建的命名空间包的 __path__ 属性会被设置为一个可迭代的目录路径列表,这些路径是在步骤 3 扫描时找到并记录的,但它没有 __file__ 属性。
__path__ 属性在后续访问包的组件时会被使用,用于搜索包的所有组件。在搜索更嵌套的元素时,命名空间包 __path__ 路径中的每个目录都会被搜索,这与普通包目录的搜索方式类似。从另一个角度看,命名空间包的 __path__ 属性对于下级组件的作用,就如同 sys.path 对于包导入路径元素的作用,它成为了访问下级元素的“上级路径”,使用之前提到的四步过程来访问。
实际上,命名空间包是通过模块搜索路径中的条目定义的目录的虚拟连接。创建后,它在功能上与普通包没有区别,支持普通包的所有操作,包括包内的相对导入。
2. 对普通包的影响:可选的 __init__.py 文件
从 Python 3.3 版本开始,包不再必须包含 __init__.py 文件。当只有一个目录的包没有这个文件时,它会被视为只有一个目录的命名空间包,并且不会显示任何警告。这大大放宽了之前的规则,符合用户的普遍看法,因为很多包不需要初始化代码,但之前
超级会员免费看
订阅专栏 解锁全文
56

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



