在 Python 中,命名空间包是分发相关模块的便捷方法。它们使多个 Python 产品能够在同一命名空间中定义模块,从而允许最终用户无缝导入它们。
从Python 3.3开始,引入了隐式命名空间包的概念。这消除了命名空间包目录中显式 __init__.py 文件的需要。导入系统会自动在 sys.path 中搜索没有 __init__.py 文件的目录,并将它们初始化为命名空间包。
对于 3.3 之前的 Python 版本,pkgutil.extend_path () 方法可用于定义显式命名空间包:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
此行将搜索路径中找到的任何常规包添加到命名空间包的 path 属性。
在常规包和命名空间包共存的场景中,前面提到的extend_path()方法已扩展为包含隐式命名空间包。这允许以下目录结构:
├── path1 │ └── package │ ├── __init__.py │ └── foo.py ├── path2 │ └── package │ └── bar.py └── path3 └── package ├── __init__.py └── baz.py
使用extend_path()的__init__.py文件,导入package.foo、导入package.bar和导入package.baz都将按预期运行。
与 pkgutil.extend_path() 相比, pkg_resources.declare_namespace() 函数尚未更新以支持隐式名称空间包。因此,建议使用 pkgutil 解决方案。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3