包装函数用于 ctypes
在某些情况下,C 函数接受函数指针。作为狂热的 ctypes
用户,我们希望使用这些函数,甚至将 python 函数作为参数传递。
让我们定义一个函数:
>>> def max(x, y):
return x if x >= y else y
现在,该函数接受两个参数并返回相同类型的结果。为了示例,我们假设 type 是 int。
就像我们在数组示例中所做的那样,我们可以定义一个表示该原型的对象:
>>> CFUNCTYPE(c_int, c_int, c_int)
<CFunctionType object at 0xdeadbeef>
该原型表示返回 c_int
(第一个参数)的函数,并接受两个 c_int
参数(其他参数)。
现在让我们包装函数:
>>> CFUNCTYPE(c_int, c_int, c_int)(max)
<CFunctionType object at 0xdeadbeef>
函数原型有更多用法:它们可以包含 ctypes
函数(如 libc.ntohl
)并验证在调用函数时使用了正确的参数。
>>> libc.ntohl() # garbage in - garbage out
>>> CFUNCTYPE(c_int, c_int)(libc.ntohl)()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: this function takes at least 1 argument (0 given)