Python 3.4 は、stdout を一時的にリダイレクトするためのこのきちんとしたツールを提供します。
# From https://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdout
with redirect_stdout(sys.stderr):
help(pow)
コードはそれほど複雑ではありませんが、何度も何度も書きたくありません。
class redirect_stdout:
def __init__(self, new_target):
self._new_target = new_target
# We use a list of old targets to make this CM re-entrant
self._old_targets = []
def __enter__(self):
self._old_targets.append(sys.stdout)
sys.stdout = self._new_target
return self._new_target
def __exit__(self, exctype, excinst, exctb):
sys.stdout = self._old_targets.pop()
with
ステートメントを使用して変数の値を一時的に変更する一般的な方法があるかどうか疑問に思っています。の他の 2 つの使用例sys
はsys.stderr
、 とsys.excepthook
です。
完璧な世界では、次のようなものが機能します。
foo = 10
with 20 as foo:
print(foo) # 20
print (foo) # 10
私はそれを機能させることができるとは思っていませんが、おそらく次のようなことが可能です:
foo = 10
with temporary_set('foo', 20):
print(foo) # 20
print (foo) # 10
を根回しすることでこれを機能させることができますが、globals()
誰もが使用することを選択するものではありません.
更新: 私の「foo = 10」の例は、私がやろうとしていることを明確にしたと思いますが、実際の使用例を伝えていません。ここに2つあります:
- redirect_stdout と同じように stderr をリダイレクトします。
- sys.excepthook を一時的に変更します。私はインタラクティブに多くの開発を行っており、excepthook に何かを追加するとき (たとえば、logging モジュールを使用して例外をログに記録するために、元の関数を独自の関数にラップすることによって)、ある時点でそれを削除したいと考えています。そうすれば、関数ラッピング自体のコピーがますます増えなくなります。この質問は、密接に関連する問題に直面しています。