PEP420让
模块绝对可以被导入:
__init__.py
文件成为可选项:https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
尽管没有这些文件,pkgutil.walk_packages
无法按预期运行:https://docs.python.org/3/library/pkgutil.html#pkgutil.walk_packages
请看以下示例:$ tree foo
foo
├── bar
│ ├── baz.py
│ └── __init__.py
├── __init__.py
└── womp.py
还有一个测试脚本
# test.py
import pkgutil
import foo
for _, mod, _ in pkgutil.walk_packages(foo.__path__, foo.__name__ + '.'):
print(mod)
在Python2和Python3中,我得到了以下输出:
$ python2.7 test.py
foo.bar
foo.bar.baz
foo.womp
$ python3.5 test.py
foo.bar
foo.bar.baz
foo.womp
删除__init__.py
文件,并仅使用python3,我得到了以下结果:
$ find -name '__init__.*' -delete
$ python3.5 test.py
foo.bar
模块绝对可以被导入:
$ python3.5 -c 'import foo.bar.baz'
$
这是一个bug吗?我必须创建__init__.py
文件才能实现我的目标吗?
walk_packages
仍然不支持PEP420本地命名空间包。我不得不重新添加__init__.py
文件来支持我的walk_packages
用例。 - Xuor