Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python循环依赖关系问题:意外错误_Python - Fatal编程技术网

python循环依赖关系问题:意外错误

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

我在一个名为“循环依赖”的目录中有一些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 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抱怨我创建了一个循环依赖项的情况下,我会预料到一个错误

-->问题:


  • 为什么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
    在sys.modules中有一个空的shell文件1。引用文件1中的函数将导致名称错误

    您可以这样做:

    file 2
    
    def add_two():
       from file1 import add_one
       ...
    
    

    为什么python不抱怨循环依赖性?这是一个无声的错误。烦人。谢谢你,这实际上帮助我更好地理解它:-)谢谢你的回答,我会查sys.modules力学。