在一些模块的 __init__.py
文件中,我看到了这样一行:
__import__('pkg_resources').declare_namespace(__name__)
它有什么作用以及人们为什么使用它?假设它与在运行时动态导入和创建命名空间有关。
最佳答案
归结为两件事:
__import__
是一个 Python 函数,它将使用字符串作为包名来导入包。它返回一个表示导入包的新对象。因此foo = __import__('bar')
将导入一个名为bar
的包,并将对其对象的引用存储在本地对象变量foo
中。来自设置实用程序 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/