使用os.getenv时减少变量名重复

时间:2012-04-23 00:22:59

标签: python

我经常发现自己在下面的样式中编写重复感觉代码(因为它发生在Django settings.py内部,但问题的含义更为普遍):

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()

  

注意:不应修改此词典的内容;

所以我想知道是否存在有效的“支持”/“已批准”解决方案,如果是,那可能是什么样的?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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词典。