From bf457c7d8224179a023957876e757f2a7ffc3d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lapeyre?= Date: Tue, 21 May 2019 00:17:30 +0200 Subject: [PATCH] bpo-36969: Make PDB args command display keyword only arguments (GH-13452) --- Lib/pdb.py | 6 ++--- Lib/test/test_pdb.py | 25 ++++++++++++++++--- .../2019-05-20-23-31-20.bpo-36969.JkZORP.rst | 2 ++ 3 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index f5d33c27fc1..0e7609e43d4 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1132,9 +1132,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): """ co = self.curframe.f_code dict = self.curframe_locals - n = co.co_argcount - if co.co_flags & 4: n = n+1 - if co.co_flags & 8: n = n+1 + n = co.co_argcount + co.co_kwonlyargcount + if co.co_flags & inspect.CO_VARARGS: n = n+1 + if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1 for i in range(n): name = co.co_varnames[i] if name in dict: diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 56d82324954..a33494d6d87 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -77,9 +77,13 @@ def test_pdb_basic_commands(): ... print('...') ... return foo.upper() + >>> def test_function3(arg=None, *, kwonly=None): + ... pass + >>> def test_function(): ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() ... ret = test_function_2('baz') + ... test_function3(kwonly=True) ... print(ret) >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE @@ -97,10 +101,13 @@ def test_pdb_basic_commands(): ... 'jump 8', # jump over second for loop ... 'return', # return out of function ... 'retval', # display return value + ... 'next', # step to test_function3() + ... 'step', # stepping into test_function3() + ... 'args', # display function args ... 'continue', ... ]): ... test_function() - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) step --Call-- @@ -123,14 +130,14 @@ def test_pdb_basic_commands(): [EOF] (Pdb) bt ... - (18)() + (21)() -> test_function() - (3)test_function() + (3)test_function() -> ret = test_function_2('baz') > (1)test_function_2() -> def test_function_2(foo, bar='default'): (Pdb) up - > (3)test_function() + > (3)test_function() -> ret = test_function_2('baz') (Pdb) down > (1)test_function_2() @@ -168,6 +175,16 @@ def test_pdb_basic_commands(): -> return foo.upper() (Pdb) retval 'BAZ' + (Pdb) next + > (4)test_function() + -> test_function3(kwonly=True) + (Pdb) step + --Call-- + > (1)test_function3() + -> def test_function3(arg=None, *, kwonly=None): + (Pdb) args + arg = None + kwonly = True (Pdb) continue BAZ """ diff --git a/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst new file mode 100644 index 00000000000..9253ab92f1f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst @@ -0,0 +1,2 @@ +PDB command `args` now display keyword only arguments. Patch contributed by +RĂ©mi Lapeyre.