3

我经常发现自己以以下样式编写重复感觉的代码(碰巧在 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

但我无意在生产中使用它,因为引用Python 文档locals()

注意:不得修改本词典的内容;

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

4

2 回答 2

4

参考:如何以编程方式设置全局(模块)变量?

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)
于 2012-04-23T00:37:15.747 回答
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字典。

于 2012-04-23T00:44:06.000 回答