2012-04-23 52 views
3

我經常發現自己在下面的風格寫重複,感覺代碼(因爲它發生,一個Django settings.py內,但問題意味着更普遍)減少變量名重複:使用時os.getenv

STACKEXCHANGE_CLIENT_ID = os.getenv('STACKEXCHANGE_CLIENT_ID') 
STACKEXCHANGE_CLIENT_SECRET = os.getenv('STACKEXCHANGE_CLIENT_SECRET') 
# et cetera 

當然有很多場合我不希望我的局部變量名稱與環境變量的名稱相匹配,但是這足以讓我想知道是否有避免名稱重複的好方法。

下面的代碼爲我工作:

_locals = locals() 
def f(x): 
    _locals[x] = os.getenv(x) 

f('TERM') 

print TERM 

但我沒有在生產中使用此,作爲意向,報價the Python documentation on locals()

注:的這本字典的內容不應該被修改;

所以我想知道是否存在有效的「支持」/「批准」的解決方案,如果是的話,它可能看起來像什麼?

回答

4

引用:How to programmatically set a global (module) variable?

import sys, os 

opts = (
    'STACKEXCHANGE_CLIENT_ID', 
    'STACKEXCHANGE_CLIENT_SECRET' 
) 

module = sys.modules[__name__] 
for o in opts: 
    setattr(module, o, os.getenv(o)) 

在此參考答案提出的意見,它鏈接到另一種暗示globals()可靠,可直接更新,以及...

_g = globals() 
for o in opts: 
    _g[o] = os.getenv(o) 
+0

這樣做,非常感謝 - 很難找到我想要的詞彙,所以完全錯過了另一個問題 – 2012-04-23 11:02:31

0

我想,這是部分是品味的問題,但我傾向於把它們放在字典中,所以:

STACKEXCHANGE_CLIENT_ID = os.getenv('STACKEXCHANGE_CLIENT_ID') 
STACKEXCHANGE_CLIENT_SECRET = os.getenv('STACKEXCHANGE_CLIENT_SECRET') 

將成爲:

envars['STACKEXCHANGE_CLIENT_ID'] = os.getenv('STACKEXCHANGE_CLIENT_ID') 
envars['STACKEXCHANGE_CLIENT_SECRET'] = os.getenv('STACKEXCHANGE_CLIENT_SECRET') 

或者,你可以只使用os.environ字典直接。

+0

這完全可以在一般情況下工作。不幸的是,OP提到了一個django項目的settings.py,期望它們成爲全局變量。有點有他在這個鬼魂。 – jdi 2012-04-23 01:01:32

+0

是的,我的要求可能不夠清晰,我只是不希望它被解釋得過於狹窄,而只是一個與Django有關的問題,但全球性絕對是一個要求;謝謝 – 2012-04-23 11:04:30

+0

不客氣,這是一個有趣的討論! – snim2 2012-04-23 12:55:58

相關問題