summaryrefslogtreecommitdiffstats
path: root/Lib/doctest.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2004-08-09 15:43:47 (GMT)
committerTim Peters <tim.peters@gmail.com>2004-08-09 15:43:47 (GMT)
commit413ced6c226b5a89c45cf2f4da79126f75cb200b (patch)
treefa16fdd9798163303b639e008cef6b84766248e1 /Lib/doctest.py
parent0d2a75c7b867fca895ac420db3585297c51864c7 (diff)
downloadcpython-413ced6c226b5a89c45cf2f4da79126f75cb200b.zip
cpython-413ced6c226b5a89c45cf2f4da79126f75cb200b.tar.gz
cpython-413ced6c226b5a89c45cf2f4da79126f75cb200b.tar.bz2
This started as a spelling and whitespace cleanup. The comment for
the set_trace fiddling didn't make sense to me, and I ended up reworking that part of the code. We really do want to save and restore pdb.set_trace, so that each dynamically nested level of doctest gets sys.stdout fiddled to what's appropriate for *it*. The only "trick" really needed is that these layers of set_trace wrappers each call the original pdb.set_trace (instead of the current pdb.set_trace).
Diffstat (limited to 'Lib/doctest.py')
-rw-r--r--Lib/doctest.py31
1 files changed, 17 insertions, 14 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index 5dd0bae..724a3ad 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -1254,27 +1254,30 @@ class DocTestRunner:
if compileflags is None:
compileflags = _extract_future_flags(test.globs)
+ save_stdout = sys.stdout
if out is None:
- out = sys.stdout.write
- saveout = sys.stdout
-
- # Note that don't save away the previous pdb.set_trace. Rather,
- # we safe pdb.set_trace on import (see import section above).
- # We then call and restore that original cersion. We do it this
- # way to make this feature testable. If we kept and called the
- # previous version, we'd end up restoring the original stdout,
- # which is not what we want.
+ out = save_stdout.write
+ sys.stdout = self._fakeout
+
+ # Patch pdb.set_trace to restore sys.stdout, so that interactive
+ # debugging output is visible (not still redirected to self._fakeout).
+ # Note that we run "the real" pdb.set_trace (captured at doctest
+ # import time) in our replacement. Because the current run() may
+ # run another doctest (and so on), the current pdb.set_trace may be
+ # our set_trace function, which changes sys.stdout. If we called
+ # a chain of those, we wouldn't be left with the save_stdout
+ # *this* run() invocation wants.
def set_trace():
- sys.stdout = saveout
+ sys.stdout = save_stdout
real_pdb_set_trace()
+ save_set_trace = pdb.set_trace
+ pdb.set_trace = set_trace
try:
- sys.stdout = self._fakeout
- pdb.set_trace = set_trace
return self.__run(test, compileflags, out)
finally:
- sys.stdout = saveout
- pdb.set_trace = real_pdb_set_trace
+ sys.stdout = save_stdout
+ pdb.set_trace = save_set_trace
if clear_globs:
test.globs.clear()