在模块中从主文件调用函数的方法
我正在尝试写一个Python脚本,具体情况是这样的:
我有一个主文件,它引入了另一个文件,这个文件里有一个类和一些函数。主文件调用了模块里的一个函数,这里一切正常,但当模块里的一个函数再去调用主文件里的另一个函数时,我就遇到了错误。
举个例子,在main.py里我有这个:
from module import *
module = Example()
def foo():
module.foo2()
def foo3():
print "here is the problem"
if(__name__ == "__main__"):
foo()
在module.py里我有:
class Example():
def foo2(self):
foo3()
foo2可以正常调用,但当我尝试调用foo3()时,我遇到了一个NameError(全局名称'foo3'未定义)。我知道我应该以某种方式引入它,但我不知道该怎么做。
最后一点:我对Python还很陌生,所以请多多解释,谢谢!
3 个回答
抱歉回复得晚了,不过我找到了一种很优雅的解决办法,虽然有点“黑科技”:
在你的主模块里,你可以加上这个:(不需要递归导入……)
module.foo3 = foo3
这样一来,foo3
在 module.py
里就变成了一个定义好的东西,即使你在那个文件里从来没有声明过它!试试看,真的有效。
我遇到这种情况是因为我想把我的图形界面放在另一个文件里,但显然这个界面需要调用主模块里的函数。所以我在绝望中找到了这个解决办法 :)
你想在主程序中调用模块里的foo3函数吗?在模块里这样做是可以的:
class Example():
def foo2(self):
from main import foo3
foo3()
不过,我不太确定这样做对模块有什么好处(这种循环依赖有多有用),因为这两个模块现在是紧密依赖的。我想你是希望Example类能够从任何调用者那里使用foo3函数。
我会这样做,把函数传递给类:
from module import *
module = Example()
def foo():
module.foo2(foo3)
def foo3():
print "here is the problem"
if __name__ == "__main__":
foo()
然后在module.py里:
class Example():
def foo2(self, myFoo):
myFoo()
我建议你避免创建循环依赖,并重新整理你的代码,让foo3要么在当前模块里,要么放在一个新的模块里。例如(我在整理的时候稍微清理了一下,以遵循PEP8的规范):
main.py
import module
example = module.Example()
def foo():
module.foo2()
if __name__ == "__main__":
foo()
module.py
import module3
class Example():
def foo2(self):
module3.foo3()
module3.py
def foo3():
print "here is the problem"
如果你真的必须保持循环依赖,那么处理这个问题的最好方法是把module.py里的导入语句移到文件的最后,就像effbot上建议的那样。不过,我还是建议你尽量避免这样做。
class Example():
def foo2(self):
main.foo3()
import main