2014-05-19 93 views
0

我正在编写一个程序,涉及从另一个模块调用的回调,以及需要访问全局变量的回调。
似乎分配给全局变量的更改在回调函数中看不到,回调函数只能看到原始分配。我猜是因为从其他模块导入。
写这种模式的正确方法是什么?

Python全局变量和回调

第一模块:

# a.py 
from b import runb 

myGlobal=None 

def init(): 
    global myGlobal 
    myGlobal=1 

def callback(): 
    print myGlobal 

def main(): 
    init() 
    runb() 

if __name__=='__main__': 
    main() 

第二个模块:

#b.py 
def runb(): 
    from a import callback 
    callback() 

我希望这个程序打印 '1',而是它打印 '无'

编辑: init只能被调用一次(这是一个复杂程序的简化)

+0

你知道最好避免循环依赖:http://stackoverflow.com/questions/1556387/circular-import-dependency-in-python –

+0

@Scorpion_God:这个链接讨论包之间​​的依赖关系,而不是模块。我知道最好避免一般的循环依赖,但有时替代品并不好。 – Photon

回答

3

Python的导入主模块__main__。当b.py通过其实际名称导入a时,该模块的新实例将以名称a加载。每个实例都有自己的myGlobal

一种解决方案是这样的:

#b.py 
def runb(): 
    from __main__ import callback 
    callback() 

另一种解决方案是创建一个新的主模块。在那里输入a,然后拨打a.main()

+0

谢谢,解决了它 – Photon

1

将文件作为模块导入时,不会调用main()函数。只有当a.py被直接执行时,__name__ == "main"才为真。

+0

但我确实直接运行a.py – Photon

+1

......这不是真的,我把它与包的'__init __。py'脚本混淆了。对不起 – jasal

+0

@Photon你能告诉我们你如何调用脚本吗? – jasal

2

如果你这样做,“从进口的回调”,然后再“myGlobal =无”将被执行,使得它打印“无”

+0

那么我可以在没有任何初始化的情况下定义全局吗?这会诀窍吗?如果是这样,怎么样? – Photon