此问题会跟进The way to make namespace packages in Python和How do I create a namespace package in Python?。
注意PEP 420和distribute docs,其中包含:
您不得在命名空间包
__init__.py
中包含任何其他代码和数据。即使它在开发过程中似乎有效,或者当项目作为.egg
文件安装时,在使用“系统”打包工具安装项目时它也无法工作 - 在这种情况下,__init__.py
文件将没有安装,更不用说执行了。
这似乎使得无法拥有一个带有独立分布式扩展子包的“主库”包。我想要的是能够:
定义一个核心库包,如下所示:
import mylibrary
mylibrary.some_function()
允许单独打包和分发的库扩展,如下所示:
import mylibrary.myextension
mylibrary.myextension.some_other_function()
我希望能够使用命名空间包执行此操作,但基于上面的问题和链接,似乎并非如此。这可以完成吗?
答案 0 :(得分:3)
对于PEP 420命名空间包,确实无法在顶级__init__.py
中使用代码。
如果我是你,我要么:
就个人而言,我会使用选项1。
PEP 420的基本原理部分解释了为什么__init__.py
不能包含任何代码。
答案 1 :(得分:1)
严格地说,你可以在mylibrary
下拥有变量,你将无法在那里定义它们。例如,你可以:
# mylibrary/core.py
import mylibrary
def some_function():
pass
mylibrary.some_function = some_function
您的用户可以像以下一样使用它:
import mylibrary.core
mylibrary.some_function()
也就是说,mylibrary.core
猴子补丁mylibrary
这样,除了导入之外,somefunction
似乎mylibrary
定义了{{1}}而不是封装