如何使模块充当带有 __path__ 变量的包?
How to make a module act as package with __path__ variable?
我试图深入研究 python import
机制并在文档的 Packages 部分遇到了这个问题:
It’s important to keep in mind that all packages are modules, but not all modules are packages. Or put another way, packages are just a special kind of module. Specifically, any module that contains a __path__
attribute is considered a package.
看起来很有趣,但我找不到任何例子来证明这一点!
那么,具体如何实施呢?
在现实世界中,您是否需要这样的实现?
通过设置 __path__
手动创建“包”将是一件非常奇怪的事情,而且我从未见过它的用例。导入系统核心应该正确处理它,但是期望“正常”包的代码可能会以各种奇特的方式中断。你可能不应该这样做。
也就是说,您要的只是简单地输入
__path__ = ['whatever', 'list', 'of', 'directories', 'you', 'want']
在您希望 Python 视为一个包的模块中。 Python 然后会将模块视为一个包,并在您人工指定的目录中查找子模块 __path__
.
例如,如果您有以下目录结构:
.
├── contents
│ └── submodule.py
└── package.py
其中 package.py
包含
import os
__path__ = [os.path.join(os.path.dirname(os.path.abspath(__file__)), 'contents')]
和contents/submodule.py
包含
x = 3
然后import package.submodule
会把package.py
当作一个包,contents/submodule.py
当作package
包的package.submodule
子模块,package.submodule.x
将解析为 3
.
我试图深入研究 python import
机制并在文档的 Packages 部分遇到了这个问题:
It’s important to keep in mind that all packages are modules, but not all modules are packages. Or put another way, packages are just a special kind of module. Specifically, any module that contains a
__path__
attribute is considered a package.
看起来很有趣,但我找不到任何例子来证明这一点! 那么,具体如何实施呢? 在现实世界中,您是否需要这样的实现?
通过设置 __path__
手动创建“包”将是一件非常奇怪的事情,而且我从未见过它的用例。导入系统核心应该正确处理它,但是期望“正常”包的代码可能会以各种奇特的方式中断。你可能不应该这样做。
也就是说,您要的只是简单地输入
__path__ = ['whatever', 'list', 'of', 'directories', 'you', 'want']
在您希望 Python 视为一个包的模块中。 Python 然后会将模块视为一个包,并在您人工指定的目录中查找子模块 __path__
.
例如,如果您有以下目录结构:
.
├── contents
│ └── submodule.py
└── package.py
其中 package.py
包含
import os
__path__ = [os.path.join(os.path.dirname(os.path.abspath(__file__)), 'contents')]
和contents/submodule.py
包含
x = 3
然后import package.submodule
会把package.py
当作一个包,contents/submodule.py
当作package
包的package.submodule
子模块,package.submodule.x
将解析为 3
.