Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有核心部分的命名空间包?_Python_Setuptools_Namespace Package - Fatal编程技术网

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

Python 具有核心部分的命名空间包?,python,setuptools,namespace-package,Python,Setuptools,Namespace Package,这项质询是跟进及跟进的 注意,和,其中说明: 在命名空间包的\uuu init\uuuu.py中不能包含任何其他代码和数据。即使在开发过程中,或者当项目作为.egg文件安装时,它可能会起作用,但当项目使用“系统”打包工具安装时,它将不起作用–在这种情况下,\uuu init\uuuuuupy文件将不会安装,更不用说执行了 这一切似乎使得拥有一个包含独立分布的扩展子包的“主库”包变得不可能。我想要的是能够: 定义一个核心库包,如下所示: import mylibrary mylibrary.s

这项质询是跟进及跟进的

注意,和,其中说明:

在命名空间包的
\uuu init\uuuu.py
中不能包含任何其他代码和数据。即使在开发过程中,或者当项目作为
.egg
文件安装时,它可能会起作用,但当项目使用“系统”打包工具安装时,它将不起作用–在这种情况下,
\uuu init\uuuuuupy
文件将不会安装,更不用说执行了


这一切似乎使得拥有一个包含独立分布的扩展子包的“主库”包变得不可能。我想要的是能够:

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

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

    import mylibrary
    
    mylibrary.some_function()
    
    import mylibrary.myextension
    
    mylibrary.myextension.some_other_function()
    

  • 我本来希望能够用名称空间包实现这一点,但基于上面的问题和链接,情况似乎并非如此。这到底可以做到吗?

    对于PEP 420命名空间包,确实不可能在顶级
    \uuuu init\uuuuuuuuuuuuuuy.py
    中包含代码

    如果我是你,我会:

  • 创建两个包,一个称为mylibrary(普通包),其中包含实际的库代码,另一个称为mylibrary_插件,这是一个命名空间包
  • 或者,创建mylibrary.lib,它是一个普通的包,包含您的代码,以及mylibrary.plugins,它是一个命名空间包
  • 就个人而言,我会使用选项1


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

    严格地说,您可以在
    mylibrary
    下有变量,但无法在那里定义它们。例如,您可以:

    # mylibrary/core.py
    import mylibrary
    def some_function():
        pass
    
    mylibrary.some_function = some_function
    
    您的用户可以像这样使用它:

    import mylibrary.core
    mylibrary.some_function()
    

    也就是说,
    mylibrary.core
    monkey补丁
    mylibrary
    ,这样,除了导入,它看起来好像
    somefunction
    是在
    mylibrary
    中定义的,而不是一个子包。

    Eric,在案例2中,
    mylibrary
    也必须是一个命名空间包,对吗?我仍然不敢相信现代Python仍然是这样。这无疑使在命名空间包中为方便而定义核心部分变得非常“困难”:/