python - python循环依赖问题:意外错误
问题描述
我在一个名为'circular_dependency'的目录中有一些python文件:
import_file_1.py:
from circular_dependency.import_file_2 import *
def add_one(x):
return x+1
import_file_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
据我了解,python 并不能很好地处理循环(嗯,实际上那些是无害的)“循环”依赖关系。所以我会预料到一个错误,python 抱怨我创建了一个循环依赖。
--> 问题:
- 为什么python不抱怨循环依赖?
- 下面的错误是什么意思?为什么
add_two
import_file_2.py 中的函数无法从 import_file_1.py 中找到函数add_one
,尽管我已经导入了该函数?
感谢您解决这个问题:-)
解决方案
main.py
在这种情况下,导入的顺序。
从main.py
,你首先导入import_file_1
。这会导致 的内容import_file_1
被加载到命名空间中。现在作为第一行的一部分import_file_1.py
,您 import import_file_2
,它添加add_two()
到命名空间。
请注意,到目前为止,add_one()
仍然是未定义的。当控制权返回时import_file_1
,add_one()
最终被添加到命名空间。但是,从逻辑上讲,这发生在which的定义add_two()
引发错误之后。
将导入行切换main.py
为以下内容可解决此问题:
from circular_dependency.import_file_2 import *
from circular_dependency.import_file_1 import *
推荐阅读
- docker - “docker pull redis”在下载时卡住了
- django - 有没有办法在 django 表单中动态过滤查询集以获得正确的外键?
- syntax-error - 为什么这个简单的 LISP 函数会抛出错误?
- javascript - 如何在 jQuery timepicker 插件中设置最大时间限制
- java - 获取 URL 参数并在 HTML 页面中打印
- python - QFileDialog 总是在主窗口后面打开
- python-3.x - 如何迭代由元组列表组成的字典?
- module - Joomla 3.9.13 中的随机图像模块有问题吗?
- php - 关于设计课程系统。我应该何时检查到期或未到期的作业?我应该把这个逻辑放在哪里?
- angular - primeNG 表上的可编辑行问题