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

时间:2016-03-21 16:51:18

标签: 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)

1 个答案:

答案 0 :(得分:1)

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

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

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

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

但是如果您先导入modules,那么还没有forward module个对象,那么forward.py文件将在第二个位置运行,{{1} }行失败,因为from .modules import ext_modules modules对象仍为空且没有module属性。