Why has the cyclical import issue disappeared?(为什么周期性进口问题消失了?)
本文介绍了为什么周期性进口问题消失了?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
导入此包时出现明显的周期性导入错误:
文件__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
问题已经解决了。可以导入包,主功能正常工作。然而,modules
和forward
之间的循环依赖关系仍然存在。这些文件保持不变。你能给我解释一下那里发生了什么事吗?(Python3.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
,因为现在存在空的对象。然后,modules.py
文件的其余部分可以继续运行,而不会发生进一步的事件。
但如果您先导入modules
,那么还没有forward
module
对象,所以再运行forward.py
文件,from .modules import ext_modules
行失败,因为modules
module
对象仍然是空的,没有ext_modules
属性。
这篇关于为什么周期性进口问题消失了?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:为什么周期性进口问题消失了?


基础教程推荐
猜你喜欢
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01