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

本教程将介绍为什么周期性进口问题消失了?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

为什么周期性进口问题消失了? 教程 第1张

问题描述

导入此包时出现明显的周期性导入错误:

文件__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')

这个导入问题可以通过交换modes.py文件中的第1行和第3行来解决。到目前为止,我想我明白是怎么回事了。

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

from . import forward
from . import modules

问题已经解决了。可以导入包,主功能正常工作。然而,modulesforward之间的循环依赖关系仍然存在。这些文件保持不变。你能给我解释一下那里发生了什么事吗?(Python3.5版)

推荐答案

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

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

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

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

但如果您先导入modules,那么还没有forwardmodule对象,所以再运行forward.py文件,from .modules import ext_modules行失败,因为modulesmodule对象仍然是空的,没有ext_modules属性。

好了关于为什么周期性进口问题消失了?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。