gpt4 book ai didi

python - 为什么 Python 在使用 from-import 时对循环导入更加严格?

转载 作者:行者123 更新时间:2023-11-30 23:49:31 33 4
gpt4 key购买 nike

我知道 Python 不鼓励任何可能导致循环导入的情况。但我想了解 Python 的内部原理,即为什么在循环导入情况下 from-import 似乎比普通导入更不宽容。

例如,此代码编译:

# main.py
import CommonUtil

# commonutil.py
import util
class CommonUtil:
# some code that uses util.Util
pass

# util.py
import commonutil
class Util:
# some code that uses commonutil.CommonUtil
pass

但是这段代码没有:

# main.py
import CommonUtil

# commonutil.py
import util
class CommonUtil:
# some code that uses util.Util
pass

# util.py
from commonutil import CommonUtil
class Util:
# some code that uses CommonUtil
pass

Traceback (most recent call last):
File "main.py", line 1, in <module>
import CommonUtil
File "commonutil.py", line 1, in <module>
import util
File "util.py", line 1, in <module>
from commonutil import CommonUtil
ImportError: cannot import name CommonUtil

只要在所有导入完成之前不尝试使用相关类,就不会遇到编译器错误。但是当你尝试做一些别名时,就会失败。有人能解释一下Python内部发生了什么导致这个错误只有在使用from-import时才会出现吗?其次,有没有什么简单的方法可以解决这个问题? (除了明显的“将共享代码拉出到第三个模块”之外,我无论如何都会这样做。)

最佳答案

模块是从上到下执行的。当第一次看到导入时,当前模块的执行将被暂停,以便可以导入其他模块。当另一个模块尝试导入第一个模块时,它会获取对当前部分执行的模块的引用。由于导入其他模块后的代码尚未执行,因此其中包含的任何名称尚不存在。

main.py

import a

a.py

var1 = 'foo'
import b
var2 = 'bar'

b.py

import a
print a.var1 # works
print a.var2 # fails

解决方法是在执行完成之前不要访问导入模块中的名称。

关于python - 为什么 Python 在使用 from-import 时对循环导入更加严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7591525/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com