2013-05-05 40 views
2

假設我有一個主模塊app.py,它定義了一個全局變量GLOBVAR = 123。此外,該模塊導入位於另一個模塊foobarPython:如何訪問調用模塊中的變量?

from foo import bar 

在主模塊app我現在從類bar調用一個方法。在該方法中,我想從主模塊app訪問值GLOBVAR

一種簡單的方法是簡單地將GLOBVAR作爲參數傳遞給方法。但是Python中是否還有另一個解決方案,可以直接訪問GLOBVAR

在模塊foo我嘗試以下之一:

from app import GLOBVAR # option 1 
import app.GLOBVAR  # option 2 

然而,這兩個選項導致以下運行時錯誤:

ImportError: cannot import name bar 

我明白這導致app之間的循環進口和foo。那麼,在Python中是否有解決方案,還是必須將該值作爲參數傳遞給函數?

+0

這就是爲什麼Globals是邪惡的 – Ant 2013-05-05 17:37:35

+1

@Ant:是的,我同意全球通常不是要走的路。但是,我也認爲在某些情況下它們是可以的,尤其是原型。但我認爲這將是另一個線程的討論:) – Matthias 2013-05-05 17:40:30

回答

4

有很多方法來解決同樣的問題,並傳遞參數通常是建議的。但是如果你確實有一些包寬的全局常量,你也可以這樣做。您需要將它們放在整個其他模塊中,並從appfoo模塊中導入該模塊。如果你構建一個全局包,你甚至可以把它們放在__init__.py ......但是也可以使用另一個命名模塊,如settingsconfig

例如,如果你封裝佈局是:

mypackage/ 
    __init__.py 
    app.py 
    foo.py 
    config.py 

然後:

配置。PY

GLOBVAR = 'something' 

app.py

from mypackage.config import GLOBVAR 

foo.py

from mypackage.config import GLOBVAR 

,如果你只是把__init__.py的變量globvar那麼你會怎麼做from mypackage import GLOBVAR如果你去那這可能是更漂亮那類的東西。

編輯我也建議使用絕對導入,即使你使用python 2,並且始終使用包名明確,而不是爲了可讀性相對進口,因爲它使事情變得更容易,如果你需要在以後拆出移動的東西到一個新的不同的包

+0

謝謝,這是對我的問題非常有幫助的答案。即使在我使用該方法之前直接導入'GLOBVAR',正如Aryan所建議的,我接受你的答案,因爲它看起來更加優雅。 – Matthias 2013-05-05 17:51:47

1

你應該在你想使用GLOBVAR之前寫入import line,這樣可以防止循環!

+0

謝謝,這解決了我的問題。 – Matthias 2013-05-05 17:48:17

+0

不客氣! ;) – Aryan 2013-05-05 17:49:52

1

在foo.py,線

from app import GLOBVAR 

必須是bar類定義後。

1

您可以將GLOBVAR放入第三個模塊,將其導入foo,並將其從foo導入app

glob.py:

GLOBVAR=None 

foo.py:

class bar: 
    global GLOBVAR 
    from glob.py import GLOBVAR 

app.py:

from foo import GLOBVAR 
import foo 
0

您可以從__main__模塊這樣導入變量:

""" main module """ 
import foo 
name = "Joe" 
foo.say_hi() 

foo.py

""" foo module, to be imported from __main__ """ 
import __main__ 
def say_hi(): 
    print "Hi, %s!" % __main__.name 

,它看起來像這樣:

$ python main.py 
Hi, Joe! 

當然,你定義它之前,你不能訪問變量。因此,您可能需要將訪問權限設置爲__main__.name處於功能級別,其中之後進行評估。與導入時評估的模塊級別(變量尚不存在的地方)相反。

相關問題