我最近一直在研究一个包含150多个文件的项目,并且在切换模块方面面临着很大的障碍。
我具有允许切换模块的功能。它以下面的方式工作(我给出一个简化的解释):
假设有四个文件,分别为tf.contrib
,first.py
,second.py
,third.py
,并且以下每个文件都有一个与文件名相同的模块,该文件名调用其先前的功能如下。
fourth.py
first.py
from second import *
def first():
second()
second.py
from third import *
def second():
third()
的内容:
third.py
from fourth import *
def third():
q = raw_input('Use (f)ourth or go (b)ack?')
if q == 'f':
fourth() # proceed to fourth
elif q == 'b':
second() # back to second module
# this is how the switching of modules work
的内容:
fourth.py
现在,当调用def fourth():
<stuff1>
时,解释器将请求first()
。如果f or b
,则执行f
,但是当输入<stuff1>
时,它会给b
这样的内容。
NameError
这基本上就是模块切换失败的原因。我尝试通过添加Traceback (most recent call last):
File "first.py", line 4, in <module>
first()
File "first.py", line 3, in first
second()
File "test/second.py", line 3, in second
third()
File "test/third.py", line 7, in third
second()
NameError: global name 'second' is not defined
来导入第三文件中的second.py
,这无济于事,而是将ImportError用作from second import second
。将ImportError: cannot import name second
声明为function names
也没有帮助。
有什么办法可以实现这一目标。或者有一种更有效的方法来解决切换问题。
编辑: 我知道正在创建循环依赖关系,但是还有其他方法可以在不创建此循环依赖关系的情况下启动和运行这四个模块。
答案 0 :(得分:2)
在我看来,这是循环导入。 问题出在 second.py 和 third.py 之间。您在 second.py 中调用 third ,然后在 third.py 中调用 second 。 您可以阅读this article来了解什么是循环进口以及如何防止它们。
P.S。我建议不要使用此语法从其他模块导入内容。
from ... import *
这可能会导致名称冲突,并且您不知道此模块内部的内容。 更好的选择是只导入您需要的东西或引用模块的特定功能。