From: Brian Ward Date: Thu, 23 Jul 2026 16:57:55 +0000 (-0400) Subject: gh-153903: Copy docstrings and other metadata in `ctypes.util.wrap_dll_function`... X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2b4e062a277f888c0139ac7196c2b6dcaed795dc;p=thirdparty%2FPython%2Fcpython.git gh-153903: Copy docstrings and other metadata in `ctypes.util.wrap_dll_function` (GH-154495) Co-authored-by: Peter Bierma --- diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 34c8636abaa9..a4de7cb09cca 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 a73422598b2c..1f2b9cf0e3ce 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -590,6 +590,8 @@ def wrap_dll_function(dll): 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 86699ad81098..28ff34f90484 100644 --- a/Lib/test/test_ctypes/test_funcptr.py +++ b/Lib/test/test_ctypes/test_funcptr.py @@ -134,12 +134,14 @@ class CFuncPtrTestCase(unittest.TestCase, StructCheckMixin): 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)