导入这个包时出现明显的循环导入错误:
文件 __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
问题解决了。包可以导入,主要功能正常。然而,modules
和 forward
之间的循环依赖仍然存在。这些文件保持不变。你能解释一下那里发生了什么吗? (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/