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 に答える