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

__import__('pkg_resources').declare_namespace(__name__)

它有什么作用,为什么人们要使用它?假设它与在运行时动态导入和创建 namespace 有关。

最佳答案

它归结为两件事:

  • __import__是一个Python函数,它将使用字符串作为包的名称导入包。它返回一个代表导入包的新对象。因此,foo = __import__('bar')将导入一个名为bar的包,并将对其对象的引用存储在本地对象变量foo中。
  • 从安装程序utils pkg_resources'文档中,declare_namespace()“声明点分的软件包名称是一个“命名空间软件包”,其包含的软件包和模块可以分布在多个发行版中。

  • 因此__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

    有关从Python 3.3开始提供类似功能的标准化机制,请参见PEP 420

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

    10-08 22:51
    查看更多