2011-10-16 18 views
36

在模块的一些__init__.py文件,我看到了这样一行:`__import __('pkg_resources')。declare_namespace(__ name __)`做了什么?

__import__('pkg_resources').declare_namespace(__name__) 

它能做什么,以及为什么人们使用它?假设它与运行时动态导入和创建名称空间有关。

+1

您可能会发现这个问题,答案有帮助: http://stackoverflow.com/questions/5064951/packaging-common-python-namespaces –

回答

34

它归结为两点:

  1. __import__是一个Python函数,将导入使用的字符串作为包的名称的包。它返回一个代表导入包的新对象。因此foo = __import__('bar')将导入名为bar的程序包并将对其对象的引用存储在本地对象变量foo中。

  2. 从设置工具pkg_resources'文档declare_namespace()“声明虚包名称是一个”名称空间包“,其包含的包和模块可能分布在多个分布中。

所以__import__('pkg_resources').declare_namespace(__name__)将导入“通过pkg_resources”包装成一个临时的,并调用存储在临时(该__import__功能declare_namespace功能很可能是使用而非import语句,以便有遗留下来的命名没有多余的符号pkg_resources)。如果此代码位于my_namespace/__init__.py,则__name__my_namespace,并且此模块将包含在my_namespace名称空间包中。

详情参见

setup tools文档见this question讨论上实现同样的效果旧机制。

请参阅PEP 420了解从Python 3.3开始提供类似功能的标准化机制。

+0

__import__是一个Python函数,而不是一个声明。 –

+0

@PierreThibault修复了它。谢谢! – Nathan

+0

什么?没有!这不是'declare_namespace'所做的。它不会将'pkg_resources'模块的内容转储到选定的名称空间中; 'pkg_resources'只是'declare_namespace'的模块。一个'foo'包可以使用'pkg_resources.declare_namespace(__ name __)'来允许它的实现被拆分成多个'foo'文件夹。将pkg_resources本身的内容拉入你的名字空间将完全适得其反。 – user2357112

4

这是一种在Python中声明所谓的“命名空间包”的方法。

都是谁,什么是问题:

想象一下,你分发里面有很多的功能,而不是所有的人都希望它的所有软件产品,所以你把它分解成块和船舶为可选插件。

你希望人们能够做到

import your_project.plugins.plugin1 
import your_project.plugins.plugin2 
... 

这是好的,如果你的目录结构是完全一样的上方,即

your_project/ 
    __init__.py 
    plugins/ 
     __init__.py 
     plugin1.py 
     plugin2.py 

但是,如果你把那些两个插件作为单独的Python包,所以他们位于两个不同的目录? 然后您可能想要在每个包的__init__.py中放入__import__('pkg_resources').declare_namespace(__name__),以便Python知道这些包是更大“名称空间包”的一部分,在我们的例子中它是your_project.plugins

欲了解更多信息,请参阅documentation

0

弥敦道,这说明看上去不正确:“所以__import__('pkg_resources').declare_namespace(__name__)将导入所有的符号从pkg_resources包,然后将它们添加到命名空间,其名称都存储在__name__。”

declare_namespace不会将pkg_resources包中的符号添加到名称存储在__name__中的名称空间。

declare_namespace执行下列操作:“声明该package'packageName'是一个名称空间包”。参考:http://galaxy.readthedocs.io/en/master/lib/pkg_resources.html#pkg_resources.declare_namespace

+0

是的,我你和@ user2357112都是对的。我更新了我的回复以反映。 – Nathan