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

这个问题随之而来在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中的代码确实是不可能的。

    如果我是你,我会:

  • 创建2个包,一个名为mylibrary(一个普通包),其中包含您的实际库代码,另一个称为mylibrary_plugins,它是一个名称空间包。
  • 或者,创建mylibrary.lib(它是一个普通的包并包含您的代码)以及mylibrary.plugins(它是一个名称空间包)。
  • 我个人会使用选项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定义的,而不是在子程序包中定义的。

    链接地址: http://www.djcxy.com/p/68659.html

    上一篇: Namespace packages with a core part?

    下一篇: How do you programatically scroll to the bottom of a TextBox in WinRT?