【问题标题】:Why is it possible to do absolute import in a submodule's __init__ in python?为什么可以在 python 的子模块的 __init__ 中进行绝对导入?
【发布时间】:2021-09-06 08:14:34
【问题描述】:

在python 3中执行import a.b.c时遵循the documentation,依次执行以下文件:a/__init__.pya/b/__init__.pya/b/c/__init__.py

我想知道a/b/__init__.py 怎么可能如下:

import a.b.c

__init__.py中的绝对导入:如果我按照推理,我应该在导入b时进入无限循环:

  1. 执行a/__init__.py
  2. 执行a/b/__init__.py
    1. 执行import a.b.c
      1. 执行a/b/__init__.py

等等等等。

但是它确实有效并将c 添加到b 命名空间。

附带问题:对__init__.py 文件使用绝对导入还是相对导入?

【问题讨论】:

    标签: python-3.x import


    【解决方案1】:

    关键答案来自this document

    import 语句几乎可以在任何地方执行。它经常 将它们放置在函数中以限制它们的可见性很有用 和/或减少初始启动时间。虽然 Python 的解释器是 优化为不多次导入同一个模块,重复 在某些情况下,执行 import 语句会严重影响性能 情况。

    因此,Python 似乎在再次在同一个命名空间中看到相同的导入时避免重新导入模块。

    当导入模块后变量、函数、类等的名称在当前命名空间中可用时,通常不需要再次导入(上面链接的文档中的例外情况)。

    以这种方式,当 Python 看到一个会导致重新导入名称的 import 语句时,Python 不会这样做(大多数情况下)。这样就避免了您描述的情况下的循环导入。

    【讨论】:

    • 感谢您的链接。实际上我已经创建了一个 repo 来玩一下导入:github.com/ClementWalter/namespaces 并且似乎 sys.modules 已更新,即使 __init__.py 没有完全运行,或者换句话说,它在实际执行之前更新__init__.py 脚本。我想了解更多有关此sys.modules 更新规则的信息
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2017-01-25
    • 2022-11-21
    • 2013-05-23
    • 2013-10-06
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多