![](/img/trans.png)
[英]How to access to calling module namespace from called module in Python?
[英]Python: How to access a variable in calling module?
說我有一個主模塊app.py
,它定義了一個全局變量GLOBVAR = 123
。 另外,此模塊導入位於另一個模塊foo
的類bar
:
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中是否有解決方案,還是我必須將值作為參數傳遞給函數?
有許多方法可以解決同樣的問題,通常建議傳遞參數。 但是,如果你確實有一些包廣泛的全局常量,你也可以這樣做。 您將需要將它們放在其他模塊中,並從app
和foo
模塊中導入該模塊。 如果你構建一個包全局變量,你甚至可以將它們放在__init__.py
...中,但也可以使用另一個命名模塊,如settings
或config
。
例如,如果您的程序包布局為:
mypackage/
__init__.py
app.py
foo.py
config.py
然后:
config.py
GLOBVAR = 'something'
app.py
from mypackage.config import GLOBVAR
foo.py
from mypackage.config import GLOBVAR
如果你只是將GLOBVAR放在__init__.py
那么你可以from mypackage import GLOBVAR
,如果你去做那種事情可能更漂亮。
編輯我還建議使用絕對導入,即使你使用的是python 2,並且總是明確地使用包名而不是相對導入以提高可讀性,並且因為如果你需要將某些內容移動到一個新的不同的東西,它會更容易拆分包
您應該在要使用GLOBVAR的位置之前寫導入行,這樣可以防止循環!
在foo.py中,該行
from app import GLOBVAR
必須在bar
類定義之后。
您可以將GLOBVAR放入第三個模塊,將其導入foo
,內部app
從foo
導入它。
glob.py:
GLOBVAR=None
foo.py:
class bar:
global GLOBVAR
from glob.py import GLOBVAR
app.py:
from foo import GLOBVAR
import foo
您可以從__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
進行訪問,並在導入后對其進行評估。 與模塊級別相反,模塊級別在導入時評估(變量尚不存在)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.