summaryrefslogtreecommitdiff
path: root/Lib/contextlib.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2013-10-10 00:46:57 -0700
committerRaymond Hettinger <python@rcn.com>2013-10-10 00:46:57 -0700
commit9103c0917e87ac4515b54a48dd4e8b8f1c514508 (patch)
treeab5c4b5bd6240dc21aefb4597d2653c560037dad /Lib/contextlib.py
parentab93cc8ac7ecfd445f044145f33d8ae52cf4f304 (diff)
downloadcpython-9103c0917e87ac4515b54a48dd4e8b8f1c514508.tar.gz
Issue #15805: Add contextlib.redirect_stdout()
Diffstat (limited to 'Lib/contextlib.py')
-rw-r--r--Lib/contextlib.py40
1 files changed, 39 insertions, 1 deletions
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
index aaab0953bd..868fa6c43d 100644
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -4,7 +4,8 @@ import sys
from collections import deque
from functools import wraps
-__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", "ignored"]
+__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack",
+ "ignored", "redirect_stdout"]
class ContextDecorator(object):
@@ -140,6 +141,43 @@ class closing(object):
def __exit__(self, *exc_info):
self.thing.close()
+class redirect_stdout:
+ """Context manager for temporarily redirecting stdout to another file
+
+ # How to send help() to stderr
+
+ with redirect_stdout(sys.stderr):
+ help(dir)
+
+ # How to write help() to a file
+
+ with open('help.txt', 'w') as f:
+ with redirect_stdout(f):
+ help(pow)
+
+ # How to capture disassembly to a string
+
+ import dis
+ import io
+
+ f = io.StringIO()
+ with redirect_stdout(f):
+ dis.dis('x**2 - y**2')
+ s = f.getvalue()
+
+ """
+
+ def __init__(self, new_target):
+ self.new_target = new_target
+
+ def __enter__(self):
+ self.old_target = sys.stdout
+ sys.stdout = self.new_target
+ return self.new_target
+
+ def __exit__(self, exctype, excinst, exctb):
+ sys.stdout = self.old_target
+
@contextmanager
def ignored(*exceptions):
"""Context manager to ignore specified exceptions