具有核心部分的命名空间包?

时间:2013-01-18 15:29:13

标签: python setuptools

此问题会跟进The way to make namespace packages in PythonHow do I create a namespace package in Python?

注意PEP 420distribute docs,其中包含:

  

您不得在命名空间包__init__.py中包含任何其他代码和数据。即使它在开发过程中似乎有效,或者当项目作为.egg文件安装时,在使用“系统”打包工具安装项目时它也无法工作 - 在这种情况下,__init__.py文件将没有安装,更不用说执行了。


这似乎使得无法拥有一个带有独立分布式扩展子包的“主库”包。我想要的是能够:

  1. 定义一个核心库包,如下所示:

    import mylibrary
    
    mylibrary.some_function()
    
  2. 允许单独打包和分发的库扩展,如下所示:

    import mylibrary.myextension
    
    mylibrary.myextension.some_other_function()
    
  3. 我希望能够使用命名空间包执行此操作,但基于上面的问题和链接,似乎并非如此。这可以完成吗?

2 个答案:

答案 0 :(得分:3)

对于PEP 420命名空间包,确实无法在顶级__init__.py中使用代码。

如果我是你,我要么:

  1. 创建2个包,一个名为mylibrary(一个普通包),其中包含您的实际库代码,另一个名为mylibrary_plugins,它是一个名称空间包。
  2. 或者,创建mylibrary.lib,这是一个普通的包,包含你的代码,以及mylibrary.plugins,它是一个命名空间包。
  3. 就个人而言,我会使用选项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}}而不是封装