Volviendo a nuestra función de ejemplo, este ejemplo debería ser comprensible ahora:
if (!PyArg_ParseTuple(args, "s", &orden)) return NULL;
Devuelve NULL (el indicador de error de las funciones que devuelven punteros a objetos) si se detecta un error en la lista de argumentos, delegando en la excepción establecida por PyArg_ParseTuple(). En caso contrario, el valor de cadena del argumento se copia a la variable local orden. Se trata de una asignación de punteros, se supone que no se debe modificar la cadena a la que apunta (por lo que en C estándar, se debería declarar la variable orden como "const char *orden").
La sentencia siguiente es una llamada a la función de Unix system(), pasándole la cadena que acabamos de obtener de PyArg_ParseTuple():
sts = system(orden);
Nuestra función spam.system() debe devolver el valor de sts como objeto de Python. Esto se logra utilizando la función Py_BuildValue(), que es de algún modo la inversa de PyArg_ParseTuple(): toma una cadena de formato y un número arbitrario de valores C y devuelve un nuevo objeto Python. Se proporcionará más información acerca de Py_BuildValue() más tarde.
return Py_BuildValue("i", sts);
En este caso, devolverá un objeto entero (¡sí, hasta los enteros son objetos en el montículo (heap) en Python!).
Si se trata de una función C que no devuelve un argumento útil (una función que
devuelve void), la función correspondiente en Python debe devolver
None
. Por convención, se utiliza:
Py_INCREF(Py_None); return Py_None;
Py_None es el nombre en C del objeto especial de Python
None
. Es un objeto Python genuino, no un puntero a NULL,
que indica una condición de error en la mayoría de los contextos, como se ha
visto.