bpo-41609: Fix output of pdb's whatis command for instance methods (GH-21935)

This commit is contained in:
Irit Katriel 2020-08-27 01:51:12 +01:00 committed by GitHub
parent b260635b3d
commit 022bc7572f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 8 deletions

View File

@ -1312,14 +1312,6 @@ class Pdb(bdb.Bdb, cmd.Cmd):
# _getval() already printed the error # _getval() already printed the error
return return
code = None code = None
# Is it a function?
try:
code = value.__code__
except Exception:
pass
if code:
self.message('Function %s' % code.co_name)
return
# Is it an instance method? # Is it an instance method?
try: try:
code = value.__func__.__code__ code = value.__func__.__code__
@ -1328,6 +1320,14 @@ class Pdb(bdb.Bdb, cmd.Cmd):
if code: if code:
self.message('Method %s' % code.co_name) self.message('Method %s' % code.co_name)
return return
# Is it a function?
try:
code = value.__code__
except Exception:
pass
if code:
self.message('Function %s' % code.co_name)
return
# Is it a class? # Is it a class?
if value.__class__ is type: if value.__class__ is type:
self.message('Class %s.%s' % (value.__module__, value.__qualname__)) self.message('Class %s.%s' % (value.__module__, value.__qualname__))

View File

@ -425,6 +425,47 @@ def test_list_commands():
(Pdb) continue (Pdb) continue
""" """
def test_pdb_whatis_command():
"""Test the whatis command
>>> myvar = (1,2)
>>> def myfunc():
... pass
>>> class MyClass:
... def mymethod(self):
... pass
>>> def test_function():
... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
>>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
... 'whatis myvar',
... 'whatis myfunc',
... 'whatis MyClass',
... 'whatis MyClass()',
... 'whatis MyClass.mymethod',
... 'whatis MyClass().mymethod',
... 'continue',
... ]):
... test_function()
--Return--
> <doctest test.test_pdb.test_pdb_whatis_command[3]>(2)test_function()->None
-> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
(Pdb) whatis myvar
<class 'tuple'>
(Pdb) whatis myfunc
Function myfunc
(Pdb) whatis MyClass
Class test.test_pdb.MyClass
(Pdb) whatis MyClass()
<class 'test.test_pdb.MyClass'>
(Pdb) whatis MyClass.mymethod
Function mymethod
(Pdb) whatis MyClass().mymethod
Method mymethod
(Pdb) continue
"""
def test_post_mortem(): def test_post_mortem():
"""Test post mortem traceback debugging. """Test post mortem traceback debugging.

View File

@ -0,0 +1 @@
The pdb whatis command correctly reports instance methods as 'Method' rather than 'Function'.