簡體   English   中英

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

我明白這會導致appfoo之間的循環導入。 那么,在Python中是否有解決方案,還是我必須將值作為參數傳遞給函數?

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

例如,如果您的程序包布局為:

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 ,內部appfoo導入它。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM