1 Функции обтекания для ctypes

В некоторых случаях функция C принимает указатель на функцию. Как алчный ctypes пользователи, мы хотели бы использовать эти функции, и даже передать функции питона в качестве аргументов.

Давайте определим функцию:

 >>> def max(x, y):
        return x if x >= y else y

 

Теперь эта функция принимает два аргумента и возвращает результат того же типа. Для примера давайте предположим, что тип - это 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)