我知道 Python 不鼓励任何可能使您进入循环导入的情况。但我想了解 Python 的内部原理,为什么 from-imports 在循环导入情况下似乎比正常导入更不宽容。
例如,此代码编译:
# 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 时才会出现?其次,有什么简单的方法可以解决这个问题吗?(除了明显的“将共享代码拉到第三个模块”之外,无论如何我都可能会这样做。)