[英]Namespace vs regular package
命名空间 Python 包(没有__init__.py
)和常规 Python 包(有__init__.py
)之间有什么区别,尤其是当__init__.py
对于常规包为空时?
我很好奇,因为最近我一直忘记在我制作的包中制作__init__.py
,而且我从未注意到任何问题。 事实上,它们的行为似乎与常规包相同。
编辑:命名空间包仅从 Python 3.3 支持(见 PEP 420 ),所以自然地,这个问题只适用于 Python 3。
从Python 3.3 开始,我们得到了命名空间包。 这些是一种特殊的包,允许您在 Python 路径的不同点上统一具有相同名称的两个包。 例如,将 path1 和 path2 视为 Python 路径上的单独条目:
path1
+--namespace
+--module1.py
+--module2.py
path2
+--namespace
+--module3.py
+--module4.py
通过这种安排,您应该能够执行以下操作:
from namespace import module1, module3
因此,您可以在单个命名空间中统一两个具有相同名称的包。
如果其中一方获得的__init__.py
变成包-你不再得到统一为其他目录将被忽略。
如果它们都有__init__.py
,则 PYTHONPATH ( sys.path
) 中的第一个是使用的。
__init__.py
曾经需要使目录成为一个包命名空间包是没有__init__.py
包。
对于一个简单包的示例,如果您有一个目录:
root
+--package
+--file1.py
+--file2.py
...
虽然您可以在package
目录中独立运行这些文件,例如使用python2 file1.py
,但在 Python 2 下,您将无法将文件作为模块导入到根目录中,例如
import package.file1
会失败,为了让它工作,你至少需要这个:
package
+--__init__.py
+--file1.py
+--file2.py
...
__init__.py
初始化包,以便您可以在__init__.py
中包含第一次导入模块时运行的代码:
run_initial_import_setup()
提供要导入的名称的__all__
列表,
__all__ = ['star_import', 'only', 'these', 'names']
如果使用以下内容导入包:
from module import *
或者,如果您只想导入目录中剩余的 .py 文件,您可以将__init__.py
完全留空。
__init__.py
命名空间: 您最初可以使用pkgutil ,自 Python 2.3 起可用。 通过将以下内容添加到每个单独的包的__init__.py
来完成添加命名空间:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
Setuptools 使用类似的方法,同样,所有__init__.py
文件都应该包含以下内容(没有其他代码):
import pkg_resources
pkg_resources.declare_namespace(__name__)
命名空间在PEP 420 中得到了更彻底的解决
另请参阅此处有关设置工具和命名空间的更多讨论:
http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
__init__.py
使得你可以在别处导入该包。__init__.py
文件可以包含每次加载模块时要执行的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.