1.3 Volviendo al ejemplo

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.


Ver Sobre este documento... para obtener información sobre sugerencias.