使用python从模块调用主文件中的函数

时间:2014-03-24 17:02:18

标签: python class function

我正在尝试制作一个可行的python脚本:

我有一个导入另一个文件的主文件,这是一个包含函数的类。 主文件调用模块中的一个函数,这里它运行良好,但是当模块内的def再次调用main中的另一个def时,我得到一个错误。

例如,在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 :(得分:1)

你想要从模块中调用main中的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()

答案 1 :(得分:1)

我会避免创建循环依赖项并重构代码,以便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

答案 2 :(得分:0)

很抱歉收到的答复很晚,但是我发现了一个非常优雅的解决方案,尽管它是“骇人的”:

在您的主模块中,您可以添加以下内容:(无需递归导入...)

module.foo3 = foo3

具有的效果是,foo3现在是module.py中的已定义事物,即使您从未在该文件中声明过它!试试看。可以。

我遇到了这种情况,我想将我的GUI界面放在另一个文件中,但是GUI显然必须调用主模块中的函数。所以我绝望地找到了这个解决方案:)