17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

470<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Garniture de la fonction<br />

Le code C d’une telle fonction pourrait être :<br />

Fonction max en C<br />

static int max(int a, int b)<br />

{<br />

int resultat;<br />

if (a > b)<br />

resultat = a;<br />

else<br />

resultat = b;<br />

}<br />

return resultat;<br />

Intégrer cette fonction comme extension Python nécessite de modifier les paramètres<br />

d’entrée et de sortie pour qu’ils deviennent utilisables par l’interpréteur. En effet,<br />

l’interpréteur invoque toutes les fonctions C sur le même modèle d’appel générique,<br />

en passant les paramètres dans des objets et en récupérant le résultat dans un objet.<br />

Ces objets sont définis dans le fichier d’en-tête Python.h, qui est installé en même<br />

temps que Python sur le système, et qui contient également des fonctions et structures<br />

annexes.<br />

On retiendra pour transformer notre fonction C trois éléments :<br />

PyObject : classe de base de tout objet manipulé par l’interpréteur ;<br />

PyArg_ParseTuple : fonction permettant la lecture des paramètres passés à la<br />

fonction par l’interpréteur ;<br />

Py_BuildValue : fonction permettant de construire un objet résultat en sortie de<br />

méthode, qui sera récupéré par l’interpréteur.<br />

Fonction max modifiée<br />

static PyObject *max(PyObject *self, PyObject *args)<br />

{<br />

int a;<br />

int b;<br />

int resultat;<br />

// récupération des paramètres<br />

if (!PyArg_ParseTuple(args, "ii", &a, &b))<br />

return NULL;<br />

// le code C<br />

if (a > b)<br />

resultat = a;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!