我阅读了文档和相当多的 stackoverflow 帖子,但没有找到明确的答案来解决我的疑问。
我想我明白命名空间包的用途。
我只对 Python>=3.3 和隐式命名空间包感兴趣 - 没有__init__.py.
命名空间包是否应该只包含其他包,或者模块(即.py文件)也“允许”?
命名空间包是否应该仅用作“容器”包,或者它们也可以包含在常规包中吗?
如果命名空间包只作为容器有意义,我想我可以声明,每当我有一个真正的包文件夹时,它的所有包含 python 模块的子文件夹也应该有__init__.py?
# this is fine
ns_package/
+-- real_package/
+-- __init.py__
# how about this?
real_package/
+-- __init.py__ # I have it for docs AND want to force the dir to be a real package
+-- ns_package/ # I would just like to avoid an empty __init__.py
+-- amodule.py
Run Code Online (Sandbox Code Playgroud)
我怀疑名称空间包仅作为容器才有意义,因为在其他情况下,我将无法使用不同路径中的其他内容扩展名称空间,因为父级是一个真正的包,必须在单个点中定义文件系统。因此我不会获得命名空间包的主要优势。
我问这个问题是因为在运行和导入模块(从项目的根目录)时,常规包内包含隐式名称空间包的情况工作得非常好。然而,它需要对安装的设置脚本进行一些调整,我想知道我一开始是否做了一些有缺陷的事情。
注意:我尝试使用隐式命名空间包主要不是因为我想利用它们的功能,而是因为我讨厌空 …