2014-05-19 106 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