python - 为什么周期性进口问题消失了?

标签 python python-3.x python-import

导入这个包时出现明显的循环导入错误:

文件 __init__.py:

from . import modules

文件forward.py:

from .modules import ext_modules

def forward(dest):
    if dest in ext_modules:
        print("forwarding to {}".format(ext_modules[dest]))

文件modules.py:

from . import forward

ext_modules = {}

def main():
    ext_modules['test'] = 'TEST'
    forward.forward('test')

这个导入问题可以解决,例如通过交换 modules.py 文件中的第 1 行和第 3 行。到目前为止,我想我明白发生了什么。

我真正不明白的是这个。当我将另一个导入添加到 __init__.py 文件的顶部时:

from . import forward
from . import modules

问题解决了。包可以导入,主要功能正常。然而,modulesforward 之间的循环依赖仍然存在。这些文件保持不变。你能解释一下那里发生了什么吗? (Python 版本 3.5)

最佳答案

导入模块时发生的第一件事是将一个 module 对象添加到sys.modules 映射中。同一模块的后续 import 语句将重新使用该对象,而不是将文件加载到内存中。

Python 然后继续执行模块内容并将生成的全局名称添加到该 module 对象。

在您的情况下,导入模块的顺序很重要。 forward直接依赖于modules模块内容,而modules只依赖于forward<模块 存在,而不是该模块的内容(forward.forward 引用依赖被推迟到 main() 被调用)。

所以如果 forward 首先导入,空的 forward module 对象被创建,第一行 from .modules import ext_modules 被执行,触发加载 modules.py 文件,然后可以安全使用 from 。 import forward 因为 empty module 对象现在存在。 modules.py 文件的其余部分可以继续运行而不会发生进一步的事故。

但是如果你先导入 modules ,那么还没有 forward module 对象,所以 forward.py 文件第二次运行,from .modules import ext_modules 行失败,因为 modules module 对象仍然是空的并且没有 ext_modules 属性。

关于python - 为什么周期性进口问题消失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36137093/

相关文章:

python - 何时使用 matplotlib.pyplot 类以及何时使用绘图对象 (matplotlib.collections.PathCollection)

Python 正则表达式 : extract "a" from "01a"

python - 读取多个blast文件(biopython)

python - 对 def __init__ 中的 __init__ 方法感到困惑

python - 为什么有时我可以使用嵌套模块中的函数而无需导入整个路径?

python - 如何从 Pandas 的列表中提取值

带有异步上下文管理器的 Python 抽象方法

python - 将小部件从另一个文件中的类导入到函数中。名称错误 : name 'textbox1' is not defined

Raspberry Pi 上的 Python 导入模块

python - 检查是否安装了 Python 包