]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-113942: Show functions implemented as builtin methods (GH-115306)
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 26 Feb 2024 18:29:49 +0000 (20:29 +0200)
committerGitHub <noreply@github.com>
Mon, 26 Feb 2024 18:29:49 +0000 (20:29 +0200)
Pydoc no longer skips global functions implemented as builtin methods,
such as MethodDescriptorType and WrapperDescriptorType.

Lib/pydoc.py
Lib/test/test_pydoc/pydocfodder.py
Lib/test/test_pydoc/test_pydoc.py
Misc/NEWS.d/next/Library/2024-02-11-20-12-39.gh-issue-113942.i72sMJ.rst [new file with mode: 0644]

index d32fa8d05044177efec0c39743f1474e365de121..b0193b4a85164a73471c610e8f36137328e04c34 100755 (executable)
@@ -855,9 +855,9 @@ class HTMLDoc(Doc):
                             cdict[key] = cdict[base] = modname + '.html#' + key
         funcs, fdict = [], {}
         for key, value in inspect.getmembers(object, inspect.isroutine):
-            # if __all__ exists, believe it.  Otherwise use old heuristic.
-            if (all is not None or
-                inspect.isbuiltin(value) or inspect.getmodule(value) is object):
+            # if __all__ exists, believe it.  Otherwise use a heuristic.
+            if (all is not None
+                or (inspect.getmodule(value) or object) is object):
                 if visiblename(key, all, object):
                     funcs.append((key, value))
                     fdict[key] = '#-' + key
@@ -1299,9 +1299,9 @@ location listed above.
                     classes.append((key, value))
         funcs = []
         for key, value in inspect.getmembers(object, inspect.isroutine):
-            # if __all__ exists, believe it.  Otherwise use old heuristic.
-            if (all is not None or
-                inspect.isbuiltin(value) or inspect.getmodule(value) is object):
+            # if __all__ exists, believe it.  Otherwise use a heuristic.
+            if (all is not None
+                or (inspect.getmodule(value) or object) is object):
                 if visiblename(key, all, object):
                     funcs.append((key, value))
         data = []
index 27037e048db81989d045387afa995db8f26f965d..3cc2d5bd57fe5b30298673798760befd44264a38 100644 (file)
@@ -81,6 +81,8 @@ class B(A):
     A_method_ref = A().A_method
     A_method_alias = A.A_method
     B_method_alias = B_method
+    count = list.count  # same name
+    list_count = list.count
     __repr__ = object.__repr__  # same name
     object_repr = object.__repr__
     get = {}.get  # same name
@@ -180,5 +182,7 @@ B_method = B.B_method  # same name
 B_method2 = B.B_method
 count = list.count  # same name
 list_count = list.count
+__repr__ = object.__repr__  # same name
+object_repr = object.__repr__
 get = {}.get  # same name
 dict_get = {}.get
index b07d9119e4940173bebe324291799ba6d08fa52c..9d40234ed01697f1eee17cd351533627e4e744ee 100644 (file)
@@ -1686,6 +1686,8 @@ class PydocFodderTest(unittest.TestCase):
         self.assertIn(' |  global_func(x, y) from test.test_pydoc.pydocfodder', lines)
         self.assertIn(' |  global_func_alias = global_func(x, y)', lines)
         self.assertIn(' |  global_func2_alias = global_func2(x, y) from test.test_pydoc.pydocfodder', lines)
+        self.assertIn(' |  count(self, value, /) from builtins.list', lines)
+        self.assertIn(' |  list_count = count(self, value, /)', lines)
         self.assertIn(' |  __repr__(self, /) from builtins.object', lines)
         self.assertIn(' |  object_repr = __repr__(self, /)', lines)
 
@@ -1714,6 +1716,8 @@ class PydocFodderTest(unittest.TestCase):
         self.assertIn('global_func(x, y) from test.test_pydoc.pydocfodder', lines)
         self.assertIn('global_func_alias = global_func(x, y)', lines)
         self.assertIn('global_func2_alias = global_func2(x, y) from test.test_pydoc.pydocfodder', lines)
+        self.assertIn('count(self, value, /) from builtins.list', lines)
+        self.assertIn('list_count = count(self, value, /)', lines)
         self.assertIn('__repr__(self, /) from builtins.object', lines)
         self.assertIn('object_repr = __repr__(self, /)', lines)
 
@@ -1757,6 +1761,10 @@ class PydocFodderTest(unittest.TestCase):
         # unbound methods
         self.assertIn('    B_method(self)', lines)
         self.assertIn('    B_method2 = B_method(self)', lines)
+        self.assertIn('    count(self, value, /) unbound builtins.list method', lines)
+        self.assertIn('    list_count = count(self, value, /) unbound builtins.list method', lines)
+        self.assertIn('    __repr__(self, /) unbound builtins.object method', lines)
+        self.assertIn('    object_repr = __repr__(self, /) unbound builtins.object method', lines)
 
     def test_html_doc_routines_in_module(self):
         doc = pydoc.HTMLDoc()
@@ -1782,6 +1790,10 @@ class PydocFodderTest(unittest.TestCase):
         # unbound methods
         self.assertIn(' B_method(self)', lines)
         self.assertIn(' B_method2 = B_method(self)', lines)
+        self.assertIn(' count(self, value, /) unbound builtins.list method', lines)
+        self.assertIn(' list_count = count(self, value, /) unbound builtins.list method', lines)
+        self.assertIn(' __repr__(self, /) unbound builtins.object method', lines)
+        self.assertIn(' object_repr = __repr__(self, /) unbound builtins.object method', lines)
 
 
 @unittest.skipIf(
diff --git a/Misc/NEWS.d/next/Library/2024-02-11-20-12-39.gh-issue-113942.i72sMJ.rst b/Misc/NEWS.d/next/Library/2024-02-11-20-12-39.gh-issue-113942.i72sMJ.rst
new file mode 100644 (file)
index 0000000..2da43a4
--- /dev/null
@@ -0,0 +1,2 @@
+:mod:`pydoc` no longer skips global functions implemented as builtin methods,
+such as :class:`~type.MethodDescriptorType` and :class:`~type.WrapperDescriptorType`.