在模块中从主文件调用函数的方法

4 投票
3 回答
8548 浏览
提问于 2025-04-17 23:41

我正在尝试写一个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 个回答

0

抱歉回复得晚了,不过我找到了一种很优雅的解决办法,虽然有点“黑科技”:

在你的主模块里,你可以加上这个:(不需要递归导入……)

module.foo3 = foo3

这样一来,foo3module.py 里就变成了一个定义好的东西,即使你在那个文件里从来没有声明过它!试试看,真的有效。

我遇到这种情况是因为我想把我的图形界面放在另一个文件里,但显然这个界面需要调用主模块里的函数。所以我在绝望中找到了这个解决办法 :)

1

你想在主程序中调用模块里的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()
3

我建议你避免创建循环依赖,并重新整理你的代码,让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

撰写回答