我经常发现自己在下面的样式中编写重复感觉代码(因为它发生在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()
:
注意:不应修改此词典的内容;
所以我想知道是否存在有效的“支持”/“已批准”解决方案,如果是,那可能是什么样的?
答案 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
词典。