【问题标题】:Namespace packages with a core part?具有核心部分的命名空间包?
【发布时间】:2013-01-02 08:26:19
【问题描述】:

此问题跟进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()
    

我本来希望能够使用命名空间包来做到这一点,但根据上面的问题和链接,情况似乎并非如此。这能做到吗?

【问题讨论】:

  • 我仍然无法相信现代 Python 仍然如此。它确实使得在命名空间包中为方便定义核心部分变得相当“困难”:/

标签: python setuptools namespace-package


【解决方案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 中定义的,而不是在子包中。

【讨论】:

    【解决方案2】:

    对于 PEP 420 命名空间包,在顶级 __init__.py 中确实不可能有代码。

    如果我是你,我会:

    1. 创建 2 个包,一个名为 mylibrary(一个普通包),其中包含您的实际库代码,另一个名为 mylibrary_plugins,它是一个命名空间包。
    2. 或者,创建一个包含您的代码的普通包 mylibrary.lib 和一个命名空间包 mylibrary.plugins。

    我个人会使用选项 1。

    PEP 420 的基本原理部分解释了为什么__init__.py 不能包含任何代码。

    【讨论】:

    • Eric,在情况 2 中,mylibrary 也必须是命名空间包,对吗?
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2013-03-25
    • 2015-07-14
    相关资源
    最近更新 更多