包装函数用于 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)