python - `__import__(' pkg_resources').declare_namespace(__name__)` 有什么作用?

标签 python module namespaces runtime

在一些模块的 __init__.py 文件中,我看到了这样一行:

__import__('pkg_resources').declare_namespace(__name__)

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

最佳答案

归结为两件事:

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

  2. 来自设置实用程序 pkg_resources'文档,declare_namespace() “声明 [s] 点分包名称 name 是一个“命名空间包”,其包含的包和模块可能分布在多个发行版中。”

所以 __import__('pkg_resources').declare_namespace(__name__) 会将 'pkg_resources' 包导入一个临时文件并调用存储在该临时文件中的 declare_namespace 函数(可能使用 __import__ 函数而不是 import 语句,因此在命名的 pkg_resources 上不会留下额外的符号)。如果此代码在 my_namespace/__init__.py 中,则 __name__my_namespace 并且此模块将包含在 my_namespace命名空间包。

setup tools文档了解更多详情

this question讨论实现相同效果的旧机制。

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

关于python - `__import__(' pkg_resources').declare_namespace(__name__)` 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7785944/

相关文章:

interface - Typescript:使用单个函数与其他 JavaScript 库一起使用

model-view-controller - Zend Framework 2 如何禁用多个 MVC 模块中的事件监听器

c++ - 在一个函数中使用 namespace 中的符号,但在同一文件中不使用另一个 namespace 中的符号

Python抽象装饰不起作用

python - while 循环不会因多个条件而停止

传递给库元谓词的目标的模块扩展

c# - MonoDevelop C# in Unity3D 试图理解 "Warning: type should be declared inside namespace AssembleCSharp"

C++ 头文件和命名空间

Python:插入似然函数的值范围总是返回相同的值

python - 为什么要开这个类?