在模块的一些__init__.py
文件,我看到了这样一行:`__import __('pkg_resources')。declare_namespace(__ name __)`做了什么?
__import__('pkg_resources').declare_namespace(__name__)
它能做什么,以及为什么人们使用它?假设它与运行时动态导入和创建名称空间有关。
在模块的一些__init__.py
文件,我看到了这样一行:`__import __('pkg_resources')。declare_namespace(__ name __)`做了什么?
__import__('pkg_resources').declare_namespace(__name__)
它能做什么,以及为什么人们使用它?假设它与运行时动态导入和创建名称空间有关。
它归结为两点:
__import__
是一个Python函数,将导入使用的字符串作为包的名称的包。它返回一个代表导入包的新对象。因此foo = __import__('bar')
将导入名为bar
的程序包并将对其对象的引用存储在本地对象变量foo
中。
从设置工具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开始提供类似功能的标准化机制。
__import__是一个Python函数,而不是一个声明。 –
@PierreThibault修复了它。谢谢! – Nathan
什么?没有!这不是'declare_namespace'所做的。它不会将'pkg_resources'模块的内容转储到选定的名称空间中; 'pkg_resources'只是'declare_namespace'的模块。一个'foo'包可以使用'pkg_resources.declare_namespace(__ name __)'来允许它的实现被拆分成多个'foo'文件夹。将pkg_resources本身的内容拉入你的名字空间将完全适得其反。 – user2357112
这是一种在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。
弥敦道,这说明看上去不正确:“所以__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
是的,我你和@ user2357112都是对的。我更新了我的回复以反映。 – Nathan
您可能会发现这个问题,答案有帮助: http://stackoverflow.com/questions/5064951/packaging-common-python-namespaces –