如何使模块充当带有 __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.