gh-156500: Reject non-positional parameters in `ctypes.util.wrap_dll_… · python/cpython@b3ddde4

GitHub

@@ -153,6 +153,47 @@ def noexist():

153153defPyObject_GetAttrString(op: ctypes.py_object, attr: ctypes.c_char_p):

154154pass

155155156+deftest_wrap_dll_function_non_positional(self):

157+# argtypes describes positional arguments only, so a parameter that

158+# cannot be passed positionally is rejected.

159+regex="'PyObject_GetAttr' has non-positional parameter"

160+161+withself.assertRaisesRegex(ValueError, regex):

162+@wrap_dll_function(ctypes.pythonapi)

163+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,

164+*args: ctypes.c_int) ->ctypes.py_object:

165+pass

166+167+withself.assertRaisesRegex(ValueError, regex):

168+@wrap_dll_function(ctypes.pythonapi)

169+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,

170+**kwargs: ctypes.c_int) ->ctypes.py_object:

171+pass

172+173+withself.assertRaisesRegex(ValueError, regex):

174+@wrap_dll_function(ctypes.pythonapi)

175+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,

176+*, kwonly: ctypes.c_int) ->ctypes.py_object:

177+pass

178+179+withself.assertRaisesRegex(ValueError, regex):

180+@wrap_dll_function(ctypes.pythonapi)

181+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,

182+*, kwonly) ->ctypes.py_object:

183+pass

184+185+# Positional-only parameters have a positional counterpart, so they

186+# are accepted.

187+@wrap_dll_function(ctypes.pythonapi)

188+defPyObject_GetAttr(op: ctypes.py_object, attr: ctypes.py_object,

189+/) ->ctypes.py_object:

190+pass

191+192+classFoo:

193+a="abc"

194+195+self.assertEqual(PyObject_GetAttr(Foo, "a"), "abc")

196+156197deftest_wrap_dll_function_str_ann(self):

157198fromtest.test_ctypesimportwrap_str_ann

158199version=wrap_str_ann.Py_GetVersion()