python循环依赖关系问题:意外错误
我在一个名为“循环依赖”的目录中有一些python文件: 导入文件\u 1.py:python循环依赖关系问题:意外错误,python,Python,我在一个名为“循环依赖”的目录中有一些python文件: 导入文件\u 1.py: from circular_dependency.import_file_2 import * def add_one(x): return x+1 导入文件\u 2.py: from circular_dependency.import_file_1 import * def add_two(x): return add_one(add_one(x)) 最后是main.py from c
from circular_dependency.import_file_2 import *
def add_one(x):
return x+1
导入文件\u 2.py:
from circular_dependency.import_file_1 import *
def add_two(x):
return add_one(add_one(x))
最后是main.py
from circular_dependency.import_file_1 import *
from circular_dependency.import_file_2 import *
x = 17
print(add_two(x))
运行main.py会导致以下错误:
/Users/fabianwerner/anaconda3/envs/academy/bin/python /Users/fabianwerner/BI-X/academy/exercises/01_exMON_python/circular_dependency/main.py
Traceback (most recent call last):
File "/Users/fabianwerner/BI-X/academy/exercises/01_exMON_python/circular_dependency/main.py", line 5, in <module>
print(add_two(x))
File "/Users/fabianwerner/BI-X/academy/exercises/01_exMON_python/circular_dependency/import_file_2.py", line 4, in add_two
return add_one(add_one(x))
NameError: name 'add_one' is not defined
Process finished with exit code 1
/Users/fabianwerner/anaconda3/envs/academy/bin/python/Users/fabianwerner/BI-X/academy/exercises/01\u exMON\u python/circular\u dependency/main.py
回溯(最近一次呼叫最后一次):
文件“/Users/fabianwerner/BI-X/academy/exercises/01_exMON_python/circular_dependency/main.py”,第5行,在
打印(添加两(x))
文件“/Users/fabianwerner/BI-X/academy/exercises/01_exMON_python/circular_dependency/import_File_2.py”,第4行,在add_two中
返回add_one(add_one(x))
名称错误:未定义名称“添加一个”
进程已完成,退出代码为1
据我所知,python并不能很好地处理循环(实际上,这些是无害的)“循环”依赖关系。因此,在python抱怨我创建了一个循环依赖项的情况下,我会预料到一个错误
-->问题:
add\u two
在导入文件中找不到导入文件中的函数add\u one
感谢您澄清:-)在这种情况下,
main.py
中的导入顺序很重要
从main.py
开始,首先导入import\u文件\u 1
。这将导致import_file_1
的内容加载到命名空间中。现在,作为import_file_1.py
第一行的一部分,您将导入import_file_2
,这将add_two()
添加到命名空间中
请注意,到目前为止,add_one()
仍未定义。当控件返回到import_file_1
时,add_one()
最终被添加到命名空间中。但是,从逻辑上讲,这是在定义了引起错误的add_two()
之后发生的
将main.py
中的导入行切换到以下位置可修复此问题:
从循环依赖项导入文件导入*
从循环_dependency.import_文件_1导入*
1-不知道
2-发生的情况是:
Python将导入的模块存储在其缓存中,即sys.modules。发生查找/导入时,它首先查看缓存,如果模块已导入,则使用缓存。所以,基本上你可以导入mymodule一百次,它只是第一次导入,剩下的只是字典查找
在循环依赖项场景中:
- 文件1已导入
- 由于在文件1中导入,文件2立即导入
- 文件1立即导入到文件2中
- 文件1已在sys.modules中,因此无需导入,继续文件2
file 2
def add_two():
from file1 import add_one
...
为什么python不抱怨循环依赖性?这是一个无声的错误。烦人。谢谢你,这实际上帮助我更好地理解它:-)谢谢你的回答,我会查sys.modules力学。