【问题标题】:Namespace package __spec__.loader and __loader__ attributes not set to None命名空间包 __spec__.loader 和 __loader__ 属性未设置为 None
【发布时间】:2019-03-22 23:57:47
【问题描述】:

Python Language Reference 声明:

向进口机器表明该规范代表一个 命名空间部分。路径条目查找器将规范中的“loader”设置为 None 和 “submodule_search_locations” 到包含 部分。

Python Library Reference 声明:

用于加载的加载器。对于命名空间包,这应该是 设置为None

创建一个命名空间包,其部分位于文件系统上的两个不同路径 a/b/

a/
  namespace_package/
    module_1.py
    module_2.py
b/
  namespace_package/
    module_3.py

然后将这些路径添加到PYTHONPATH 环境变量中:

export PYTHONPATH="a:b"

最后导入命名空间包并使用 CPython 3.7 解释器打印其 __spec__.loader__loader__ 属性:

python3 -c "import namespace_package; print(namespace_package.__spec__.loader); print(namespace_package.__loader__)"

表明他们是不是 None:

<_frozen_importlib_external._namespaceloader><_frozen_importlib_external._namespaceloader>

是文档错误、实施错误还是我的误解?

【问题讨论】:

    标签: python import namespaces package python-import


    【解决方案1】:

    看起来像it was righthas been changed

    打开一个问题来跟踪它:https://bugs.python.org/issue35181

    【讨论】:

      【解决方案2】:

      我猜它曾经是 None,但由于 Python 的变化而不再是。是不是给你带来了麻烦?如果是这样,那么我会提出一个问题,但解决方案很可能是更新文档。你能检查一下你用 Python 3.6 和/或 3.5 得到了什么结果吗?也可能值得查看 Python 发行说明,以了解该领域有哪些更新。

      【讨论】:

      【解决方案3】:

      在这种情况下,mod.__spec__.loadermod.__loader__ 不同。规范的加载器应该仍然是None。模块的加载器由导入机制设置为内部_NamespaceLoader 的实例,部分是为了重新加载。也许文档对此不够清楚。

      【讨论】:

      • 但事实并非如此:__loader____spec__.loader 属性都not None 而是相同的_frozen_importlib_external._NamespaceLoader 对象。我已经更新了我的问题以反映这一点。所以我认为我们这里有问题。
      • 这是因为 PEP 420 的实现在 2018 年 2 月在这里发生了变化:github.com/python/cpython/pull/5481
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多