Python Language Fonctions d'emballage pour les types


Exemple

Dans certains cas, une fonction C accepte un pointeur de fonction. En tant ctypes avides de ctypes , nous aimerions utiliser ces fonctions, et même passer la fonction python en argument.

Définissons une fonction:

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

Maintenant, cette fonction prend deux arguments et renvoie un résultat du même type. Pour l'exemple, supposons que ce type est un int.

Comme nous l'avons fait sur l'exemple du tableau, nous pouvons définir un objet qui dénote ce prototype:

>>> CFUNCTYPE(c_int, c_int, c_int)
<CFunctionType object at 0xdeadbeef>

Ce prototype dénote une fonction qui retourne un c_int (le premier argument) et accepte deux arguments c_int (les autres arguments).

Maintenant, enveloppons la fonction:

>>> CFUNCTYPE(c_int, c_int, c_int)(max)
<CFunctionType object at 0xdeadbeef>

Les prototypes de fonctions ont plus d'usage: ils peuvent envelopper la fonction ctypes (comme libc.ntohl ) et vérifier que les arguments corrects sont utilisés lors de l'appel de la fonction.

>>> 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)