下面是我的代码。
主要.py:
import moduleA
print('It works!')
模块A.py:
import moduleB
def functionA():
return 0
模块B.py:
import moduleA
globalVariableFromModuleB = moduleA.functionA()
如果我运行它,我会收到错误消息:
$ python main.py
Traceback (most recent call last):
File "main.py", line 3, in <module>
import moduleA
File "/home/asa/bugs/moduleA.py", line 3, in <module>
import moduleB
File "/home/asa/bugs/moduleB.py", line 8, in <module>
globalVariableFromModuleB_1 = functionB()
File "/home/asa/bugs/moduleB.py", line 6, in functionB
return moduleA.functionA()
Q1:在我的情况下 moduleB 显式导入 moduleA,因此我希望它可以工作,但它没有。这是因为 Python 兑现进口并且不做两次吗?但是为什么它不能从内存中取出已经兑现的 moduleA.functionA() 而不是失败呢?因此,我认为当前的行为是一个错误。
Q2:如果我删除“globalVariableFromModuleB = moduleA.functionA()”这一行,只留下循环导入“import moduleA”,那么我没有失败。因此,循环依赖在 Python 中是不被禁止的。如果他们不正确地工作,因为它显示了我的例子,他们被允许做什么?
Q3:如果我将“import moduleA”更改为“from moduleA import functionA”,主程序将无法运行,并出现另一条消息“ImportError: cannot import name functionA”。
此外,我想在这里为那些不喜欢重新设计应用程序的人发布一个解决方法,比如我的情况。
解决方法(只是通过实验发现)。在main.py中的“import moduleA”之前添加“import moduleB” ,即:
# main.py
import moduleB
import moduleA
print('It works!')
但是我不得不在代码中的这个导入处留下很长的评论,因为 main.py 不直接使用来自 moduleB 的任何 API,所以它看起来很丑。
有人可以建议一些更好的方法来解决这种情况并回答上面的 3 个问题吗?