2017-12-14 3 views
1

Python 3のスコープ内で変数を保存/復元する簡単な方法はありますか?例えばPython 3で変数を保存/復元する一般的な方法

x=4 
with x=5: 
    ... do something with x that's temporarily 5 

または

with os.environ["FOO"] = "BAR": 
    ... do something here 

それはこれを実装するPythonインタプリタのための超簡単になるように思え割り当ての左側が保存されている(、右側があります__enter__で実行、__exit__に復元)

または少なくともいくつかのライブラリなどです。

これを一時変数で実行するには、try/finallyブロックが必要であり、本質的に安全でなく、ランタイムエラーが発生しがちです。これは、比較すると「不快」と思われる。

try: 
    save = os.environ["FOO"] 
    os.environ["FOO"] = "BAR" 

    ... do something here 

finally: 
    os.environ["FOO"] = save 
+2

なぜ、このようにそれを行いますか? unpythonicと思われ、コードの可読性が低下します。なぜ一時変数を使用しないのですか? – ubadub

+4

なぜ機能ではないのですか?とにかく、よりメンテナンス可能なコードを作成します。 – deceze

+1

上記の両方の質問に回答し、提案された構文がはるかに「pythonic」である理由を説明しました。読みやすく、バグの原因になりません。また、多くの場合、「機能」は利用できません。 (ENVの修正は標準的な例ですが、他にもたくさんあります) –

答えて

0

これを行うライブラリを作成しました。しかし、それを行う簡単な方法があるかどうかはわかりません。私のライブラリは "patch.object"と "patch.dict"のクローンであるかもしれませんね。それらの文書は私にはあいまいです。例えば

https://gist.github.com/earonesty/ac0617a5672ae1a41be1eaf316dd63e4

import os 
from varlib import vartemp, envtemp 

x = 3 
y = 4 
print ("Before: x is", x, "y is", y) 

with vartemp({'x':93,'y':94}): 
    print ("In temp: x is", x, "y is", y) 

print ("After: x is", x, "y is", y) 

with envtemp({'foo':'bar'}): 
    print(os.getenv('foo')) 

print(os.getenv('foo')) 

出力はここにある:

Before: x is 3 y is 4 
In temp: x is 93 y is 94 
After: x is 3 y is 4 
bar 
None 
+5

あなたのライブラリを宣伝する質問をしましたか? – kazemakase

+2

私はあなたのライブラリについて '/ r/Python'と言うことができると思います。 SOは宣伝用ではありません。 – ForceBru

+2

@kazemakase質問や自己回答には何も問題はありません。私たちは、宣伝なしに自己宣伝に目を向けますが、「この問題を解決する図書館を作った」と言って、それを使用するのに必要なコードを含めても100%OKです。 –

関連する問題