]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-139076: Fix regression in pydoc not showing extension functions (GH-139077...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 7 Oct 2025 19:57:28 +0000 (21:57 +0200)
committerGitHub <noreply@github.com>
Tue, 7 Oct 2025 19:57:28 +0000 (21:57 +0200)
Fix a bug in the pydoc module that was hiding functions in a Python
module if they were implemented in an extension module and the module did
not have __all__.
(cherry picked from commit 7257b24140ac1b39fb8cfd4610134ec79575a396)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/pydoc.py
Lib/test/test_pydoc/pydocfodder.py
Lib/test/test_pydoc/test_pydoc.py
Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst [new file with mode: 0644]

index 7528178fdcae97f3b5b9f38562ef47f765be2eff..2a99fc40dda3fdd88761866b44b86d065e81c0e1 100644 (file)
@@ -884,6 +884,7 @@ class HTMLDoc(Doc):
         for key, value in inspect.getmembers(object, inspect.isroutine):
             # if __all__ exists, believe it.  Otherwise use a heuristic.
             if (all is not None
+                or inspect.isbuiltin(value)
                 or (inspect.getmodule(value) or object) is object):
                 if visiblename(key, all, object):
                     funcs.append((key, value))
@@ -1328,6 +1329,7 @@ location listed above.
         for key, value in inspect.getmembers(object, inspect.isroutine):
             # if __all__ exists, believe it.  Otherwise use a heuristic.
             if (all is not None
+                or inspect.isbuiltin(value)
                 or (inspect.getmodule(value) or object) is object):
                 if visiblename(key, all, object):
                     funcs.append((key, value))
index 3cc2d5bd57fe5b30298673798760befd44264a38..412aa3743e430b35c08619e4e2170f31261168d8 100644 (file)
@@ -87,6 +87,8 @@ class B(A):
     object_repr = object.__repr__
     get = {}.get  # same name
     dict_get = {}.get
+    from math import sin
+
 
 B.B_classmethod_ref = B.B_classmethod
 
@@ -186,3 +188,4 @@ __repr__ = object.__repr__  # same name
 object_repr = object.__repr__
 get = {}.get  # same name
 dict_get = {}.get
+from math import sin  # noqa: F401
index 953cfe69f87cb8d991719481bceadee6aa612c56..fb0a8bb7b2339b5305be167238076faa4fc7f4b8 100644 (file)
@@ -1939,9 +1939,11 @@ class PydocFodderTest(unittest.TestCase):
         if not support.MISSING_C_DOCSTRINGS:
             self.assertIn(' |  get(key, default=None, /) method of builtins.dict instance', lines)
             self.assertIn(' |  dict_get = get(key, default=None, /) method of builtins.dict instance', lines)
+            self.assertIn(' |  sin(x, /)', lines)
         else:
             self.assertIn(' |  get(...) method of builtins.dict instance', lines)
             self.assertIn(' |  dict_get = get(...) method of builtins.dict instance', lines)
+            self.assertIn(' |  sin(...)', lines)
 
         lines = self.getsection(result, f' |  Class methods {where}:', ' |  ' + '-'*70)
         self.assertIn(' |  B_classmethod(x)', lines)
@@ -2027,6 +2029,11 @@ class PydocFodderTest(unittest.TestCase):
             self.assertIn('    __repr__(...) unbound builtins.object method', lines)
             self.assertIn('    object_repr = __repr__(...) unbound builtins.object method', lines)
 
+        # builtin functions
+        if not support.MISSING_C_DOCSTRINGS:
+            self.assertIn('    sin(x, /)', lines)
+        else:
+            self.assertIn('    sin(...)', lines)
 
     def test_html_doc_routines_in_module(self):
         doc = pydoc.HTMLDoc()
@@ -2067,6 +2074,12 @@ class PydocFodderTest(unittest.TestCase):
             self.assertIn(' __repr__(...) unbound builtins.object method', lines)
             self.assertIn(' object_repr = __repr__(...) unbound builtins.object method', lines)
 
+        # builtin functions
+        if not support.MISSING_C_DOCSTRINGS:
+            self.assertIn(' sin(x, /)', lines)
+        else:
+            self.assertIn(' sin(...)', lines)
+
 
 @unittest.skipIf(
     is_wasm32,
diff --git a/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst b/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst
new file mode 100644 (file)
index 0000000..5e0ae6e
--- /dev/null
@@ -0,0 +1,3 @@
+Fix a bug in the :mod:`pydoc` module that was hiding functions in a Python
+module if they were implemented in an extension module and the module did
+not have ``__all__``.