首页 > 解决方案 > 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 抱怨我创建了一个循环依赖。

--> 问题:

  1. 为什么python不抱怨循环依赖?
  2. 下面的错误是什么意思?为什么add_twoimport_file_2.py 中的函数无法从 import_file_1.py 中找到函数add_one,尽管我已经导入了该函数?

感谢您解决这个问题:-)

标签: python

解决方案


main.py在这种情况下,导入的顺序。

main.py,你首先导入import_file_1。这会导致 的内容import_file_1被加载到命名空间中。现在作为第一行的一部分import_file_1.py,您 import import_file_2,它添加add_two()到命名空间。

请注意,到目前为止,add_one()仍然是未定义的。当控制权返回时import_file_1add_one()最终被添加到命名空间。但是,从逻辑上讲,这发生which的定义add_two()引发错误之后。

将导入行切换main.py为以下内容可解决此问题:

from circular_dependency.import_file_2 import *
from circular_dependency.import_file_1 import *

推荐阅读