]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41609: Fix output of pdb's whatis command for instance methods (GH-21935) (#21976)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 27 Aug 2020 01:17:05 +0000 (18:17 -0700)
committerGitHub <noreply@github.com>
Thu, 27 Aug 2020 01:17:05 +0000 (03:17 +0200)
(cherry picked from commit 022bc7572f061e1d1132a4db9d085b29707701e7)

Co-authored-by: Irit Katriel <iritkatriel@yahoo.com>
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst [new file with mode: 0644]

index 081023526c0ea0438bf9e91f498b5b78f0e17ad2..d7d957159458be0e0c0f1882beec348fddec6238 100755 (executable)
@@ -1312,21 +1312,21 @@ class Pdb(bdb.Bdb, cmd.Cmd):
             # _getval() already printed the error
             return
         code = None
-        # Is it a function?
+        # Is it an instance method?
         try:
-            code = value.__code__
+            code = value.__func__.__code__
         except Exception:
             pass
         if code:
-            self.message('Function %s' % code.co_name)
+            self.message('Method %s' % code.co_name)
             return
-        # Is it an instance method?
+        # Is it a function?
         try:
-            code = value.__func__.__code__
+            code = value.__code__
         except Exception:
             pass
         if code:
-            self.message('Method %s' % code.co_name)
+            self.message('Function %s' % code.co_name)
             return
         # Is it a class?
         if value.__class__ is type:
index 0e7ae1d86ed80895f9194ccc674146d7ce71d884..9c9471a8cc8df321f271e0b9475fa2b034bab28d 100644 (file)
@@ -425,6 +425,47 @@ def test_list_commands():
     (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():
     """Test post mortem traceback debugging.
diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-51-15.bpo-41609.JmiUKG.rst
new file mode 100644 (file)
index 0000000..ecaf40e
--- /dev/null
@@ -0,0 +1 @@
+The pdb whatis command correctly reports instance methods as 'Method' rather than 'Function'.
\ No newline at end of file