簡體   English   中英

在Python中的模塊/模塊作用域中訪問變量

[英]Accessing variable in module / Module scope in Python

我想在模塊內的應用程序中使用定義的變量。

文件夾結構:

myapp.py

modules / checkargs.py

modules / init .py(一個空文件)

主應用程序(myapp.py):

_PARAMETERS = {
    'stuff': 'here'
}

from modules.checkargs import checkargs

if __name__ == "__main__":
    checkargs(sys.argv[1:])

checkargs.py:

def checkargs(argv):

    global _PARAMETERS;

    #more Python insanity here

錯誤:

NameError:全局名稱“ _PARAMETERS”未定義

通常,您應該避免這種編程風格。 模塊不應依賴於其他模塊中定義的全局變量。 更好的解決方案是將_PARAMETERS傳遞到checkargs ,或將_PARAMETERS移至可以由多個模塊共享的文件。

將數據傳遞給checkargs

一般來說,依靠全局變量是一個壞主意。 也許最好的解決方案是將PARAMETERS直接傳遞到您的checkargs函數中。

# checkargs.py
def checkargs(argv, parameters):
    ...

# myapp.py
if __name__ == "__main__":
    checkargs(sys.argv[1:], _PARAMETERS)

創建共享數據模塊

如果您有要在模塊之間共享的數據,則可以將該數據放在每個其他模塊導入的第三個模塊中:

# modules/shared.py
PARAMETERS = {...}

# myapp.py
from modules.shared import PARAMETERS

# checkargs.py
from modules.shared import PARAMETERS

其他解決方案

還有其他解決方案,盡管我認為上述兩種解決方案是最好的。 例如,您的主程序可以將參數復制到checkargs模塊,如下所示:

# myapp.py
import checkargs
checkargs._PARAMETERS = _PARAMETERS
...

您也可以讓checkargs直接引用主模塊中的值,但這需要循環導入。 應避免循環進口。

為什么要定義它? 它來自其他模塊。 在checkargs.py中,您需要執行以下操作:

from myapp import _PARAMETERS

然而:

  1. 您不應該使用_命名,因為這意味着私有/受保護的變量。
  2. 您可能應該將字典從myapp傳遞到checkargs函數中,而不是將其導入那里。 如果不這樣做,那么您將創建一個循環導入,這在邏輯上是可怕的,實際上是行不通的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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