diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 34c8636abaa925d..1a10267bd628eb8 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -708,6 +708,7 @@ Specifying function pointers using type annotations @wrap_dll_function(dll_to_wrap) def function_ptr_name(arg_name: ctypes_type, ...) -> ctypes_type: + """Optional docstring.""" # There should be no body pass 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)