From 35425d638c0eeb8377620e016f47df3ae08d7061 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 22 Sep 2017 12:29:42 -0400 Subject: bpo-31389 Add an optional `header` argument to pdb.set_trace() (#3438) * Give pdb.set_trace() an optional `header` argument * What's new. * Give pdb.set_trace() an optional `header` argument * What's new. --- Doc/library/pdb.rst | 12 ++++++++---- Doc/whatsnew/3.7.rst | 7 +++++++ Lib/pdb.py | 7 +++++-- Lib/test/test_pdb.py | 12 ++++++++++++ .../next/Library/2017-09-07-15-31-47.bpo-31389.jNFYqB.rst | 2 ++ 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-09-07-15-31-47.bpo-31389.jNFYqB.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 6225a3a..c5d4181 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -118,11 +118,15 @@ slightly different way: is entered. -.. function:: set_trace() +.. function:: set_trace(*, header=None) - Enter the debugger at the calling stack frame. This is useful to hard-code a - breakpoint at a given point in a program, even if the code is not otherwise - being debugged (e.g. when an assertion fails). + Enter the debugger at the calling stack frame. This is useful to hard-code + a breakpoint at a given point in a program, even if the code is not + otherwise being debugged (e.g. when an assertion fails). If given, + ``header`` is printed to the console just before debugging begins. + + .. versionadded:: 3.7 + The keyword-only argument ``header``. .. function:: post_mortem(traceback=None) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 870ca06..a19a289 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -232,6 +232,13 @@ New function :func:`os.register_at_fork` allows registering Python callbacks to be executed on a process fork. (Contributed by Antoine Pitrou in :issue:`16500`.) +pdb +--- + +:func:`~pdb.set_trace` now takes an optional ``header`` keyword-only +argument. If given, this is printed to the console just before debugging +begins. + string ------ diff --git a/Lib/pdb.py b/Lib/pdb.py index 97618b0..8dd4ded 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1581,8 +1581,11 @@ def runctx(statement, globals, locals): def runcall(*args, **kwds): return Pdb().runcall(*args, **kwds) -def set_trace(): - Pdb().set_trace(sys._getframe().f_back) +def set_trace(*, header=None): + pdb = Pdb() + if header is not None: + pdb.message(header) + pdb.set_trace(sys._getframe().f_back) # Post-Mortem interface diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 755d265..71d8203 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -9,9 +9,12 @@ import unittest import subprocess import textwrap +from contextlib import ExitStack +from io import StringIO from test import support # This little helper class is essential for testing pdb under doctest. from test.test_doctest import _FakeInput +from unittest.mock import patch class PdbTestInput(object): @@ -1107,6 +1110,15 @@ class PdbTestCase(unittest.TestCase): if save_home is not None: os.environ['HOME'] = save_home + def test_header(self): + stdout = StringIO() + header = 'Nobody expects... blah, blah, blah' + with ExitStack() as resources: + resources.enter_context(patch('sys.stdout', stdout)) + resources.enter_context(patch.object(pdb.Pdb, 'set_trace')) + pdb.set_trace(header=header) + self.assertEqual(stdout.getvalue(), header + '\n') + def tearDown(self): support.unlink(support.TESTFN) diff --git a/Misc/NEWS.d/next/Library/2017-09-07-15-31-47.bpo-31389.jNFYqB.rst b/Misc/NEWS.d/next/Library/2017-09-07-15-31-47.bpo-31389.jNFYqB.rst new file mode 100644 index 0000000..7f45968 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-07-15-31-47.bpo-31389.jNFYqB.rst @@ -0,0 +1,2 @@ +``pdb.set_trace()`` now takes an optional keyword-only argument ``header``. +If given, this is printed to the console just before debugging begins. -- cgit v0.12