Python循环依赖问题:意外错误

Fab*_*ner 5 python

我在名为“ circular_dependency”的目录中有一些python文件:

import_file_1.py:

from circular_dependency.import_file_2 import *

def add_one(x):
    return x+1
Run Code Online (Sandbox Code Playgroud)

import_file_2.py:

from circular_dependency.import_file_1 import *

def add_two(x):
    return add_one(add_one(x))
Run Code Online (Sandbox Code Playgroud)

最后是main.py

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

x = 17
print(add_two(x))
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)

据我了解,python并不能很好地应对循环(嗯,实际上是无害的)“循环”依赖关系。因此,当python抱怨我已经创建了循环依赖的事实时,我会想到一个错误。

->问题:

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

感谢您清理此问题:-)

Ano*_*sai 1

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

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

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

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

from circular_dependency.import_file_2 import *
from circular_dependency.import_file_1 import *
Run Code Online (Sandbox Code Playgroud)