diff options
author | Berker Peksag <berker.peksag@gmail.com> | 2014-11-28 21:28:06 (GMT) |
---|---|---|
committer | Berker Peksag <berker.peksag@gmail.com> | 2014-11-28 21:28:06 (GMT) |
commit | bb44fe0a0bf0b1688f95b3cce34a69d98a58e371 (patch) | |
tree | a1cabb3c2abb956203dec777af9091394e47317a /Lib/contextlib.py | |
parent | ae553eb794cae10de0ece64de096647a8b304137 (diff) | |
download | cpython-bb44fe0a0bf0b1688f95b3cce34a69d98a58e371.zip cpython-bb44fe0a0bf0b1688f95b3cce34a69d98a58e371.tar.gz cpython-bb44fe0a0bf0b1688f95b3cce34a69d98a58e371.tar.bz2 |
Issue #22389: Add contextlib.redirect_stderr().
Diffstat (limited to 'Lib/contextlib.py')
-rw-r--r-- | Lib/contextlib.py | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 82ee955..2fbc90c 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -5,7 +5,7 @@ from collections import deque from functools import wraps __all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", - "redirect_stdout", "suppress"] + "redirect_stdout", "redirect_stderr", "suppress"] class ContextDecorator(object): @@ -151,8 +151,27 @@ class closing(object): def __exit__(self, *exc_info): self.thing.close() -class redirect_stdout: - """Context manager for temporarily redirecting stdout to another file + +class _RedirectStream: + + _stream = None + + 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(getattr(sys, self._stream)) + setattr(sys, self._stream, self._new_target) + return self._new_target + + def __exit__(self, exctype, excinst, exctb): + setattr(sys, self._stream, self._old_targets.pop()) + + +class redirect_stdout(_RedirectStream): + """Context manager for temporarily redirecting stdout to another file. # How to send help() to stderr with redirect_stdout(sys.stderr): @@ -164,18 +183,13 @@ class redirect_stdout: help(pow) """ - 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 = [] + _stream = "stdout" - 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() +class redirect_stderr(_RedirectStream): + """Context manager for temporarily redirecting stderr to another file.""" + + _stream = "stderr" class suppress: |