我正在尝试制作一个可行的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很新,所以请解释一下:-) 谢谢
答案 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显然必须调用主模块中的函数。所以我绝望地找到了这个解决方案:)