具有核心部分的命名空间包?
这个问题随之而来在Python中制作命名空间包的方式以及如何在Python中创建一个名称空间包?
请注意PEP 420和分发文档,其中声明:
您不得在命名空间包的__init__.py
包含任何其他代码和数据。 即使它在开发过程中似乎可以工作,或者当项目以.egg
文件的形式安装时,在使用“系统”打包工具安装项目时也不会工作 - 在这种情况下, __init__.py
文件将不会安装,请独自执行。
这似乎使得拥有独立分布的扩展子包的“主库”包是不可能的。 我想要的是能够:
定义一个核心库包,用于这样的:
import mylibrary
mylibrary.some_function()
允许分开打包和分发的库扩展,如下所示:
import mylibrary.myextension
mylibrary.myextension.some_other_function()
我希望能够使用命名空间包来做到这一点,但根据上面的问题和链接,似乎并非如此。 这可以完成吗?
对于PEP 420名称空间包,顶级__init__.py
中的代码确实是不可能的。
如果我是你,我会:
我个人会使用选项1。
PEP 420的基本原理部分解释了为什么__init__.py
不能包含任何代码。
严格来说,你可以在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
定义的,而不是在子程序包中定义的。
上一篇: Namespace packages with a core part?
下一篇: How do you programatically scroll to the bottom of a TextBox in WinRT?