https://github.com/python/cpython/commit/2b4e062a277f888c0139ac7196c2b6dcaed795dc
commit: 2b4e062a277f888c0139ac7196c2b6dcaed795dc
branch: main
author: Brian Ward <[email protected]>
committer: ZeroIntensity <[email protected]>
date: 2026-07-23T16:57:55Z
summary:

gh-153903: Copy docstrings and other metadata in 
`ctypes.util.wrap_dll_function` (GH-154495)

Co-authored-by: Peter Bierma <[email protected]>

files:
M Doc/library/ctypes.rst
M Lib/ctypes/util.py
M Lib/test/test_ctypes/test_funcptr.py

diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 34c8636abaa925d..a4de7cb09cca9da 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -708,8 +708,7 @@ Specifying function pointers using type annotations
 
       @wrap_dll_function(dll_to_wrap)
       def function_ptr_name(arg_name: ctypes_type, ...) -> ctypes_type:
-         # There should be no body
-         pass
+         """Optional docstring. There should be no function body."""
 
    The body of the decorated function is ignored, and any parameters that are
    missing type annotations are skipped. The names of the parameters are 
ignored
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index a73422598b2cd96..1f2b9cf0e3ce8dd 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -590,6 +590,8 @@ def decorator(func):
 
         ptr.restype = restype
         ptr.argtypes = tuple(annotations.values())
+        functools.update_wrapper(ptr, func, updated=())
+
         return ptr
 
     return decorator
diff --git a/Lib/test/test_ctypes/test_funcptr.py 
b/Lib/test/test_ctypes/test_funcptr.py
index 86699ad81098275..28ff34f9048454d 100644
--- a/Lib/test/test_ctypes/test_funcptr.py
+++ b/Lib/test/test_ctypes/test_funcptr.py
@@ -134,12 +134,14 @@ def test_abstract(self):
     def test_wrap_dll_function(self):
         @wrap_dll_function(ctypes.pythonapi)
         def PyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object) -> 
ctypes.py_object:
+            """Call the PythonAPI function underlying getattr"""
             pass
 
         class Foo:
             a = "abc"
 
         self.assertEqual(PyObject_GetAttr(Foo, "a"), "abc")
+        self.assertEqual(PyObject_GetAttr.__doc__, "Call the PythonAPI 
function underlying getattr")
 
         with self.assertRaises(AttributeError):
             @wrap_dll_function(ctypes.pythonapi)

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to