? Estoy empezando a jugar con las extensiones Python C y tengo curiosidad por saber por qué una función C, invocable desde Python debe tomar 2 argumentos PyObject * y devuelve un PyObject *. Escribí el siguiente "Hello World" extensión:Extensiones de Python C: ¿por qué las funciones C invocables toman argumentos y devuelven PyObject *
#include <Python.h>
static PyObject *
hello_world(PyObject *self, PyObject *noargs)
{
printf("Hello World\n");
return Py_BuildValue("");
}
// Module functions table.
static PyMethodDef
module_functions[] = {
{ "hello_world", hello_world, METH_NOARGS, "hello world method" },
{ NULL }
};
// This function is called to initialize the module.
PyMODINIT_FUNC
inittesty2(void)
{
Py_InitModule("testy2", module_functions);
}
Por qué no puedo (especialmente con METH_NOARGS) utiliza el siguiente método hola_mundo:
static void
hello_world()
{
printf("Hello World\n");
}
?
Es 'Py_None', no' PyNone'. También hay 'Py_RETURN_NONE' similar a' Py_RETURN_TRUE' y 'Py_RETURN_FALSE'. – yak
Para (3), corrígeme si me equivoco pero si el código usa una convención de llamadas donde todos los argumentos se pasan en la pila y el llamado (la función) los saca de la pila, eliminar el argumento no utilizado provocaría un bloqueo porque Python siempre pasará NULL como el segundo arg y la función no lo abrirá. – yak
@yak No causa un bloqueo en mi código. – jogojapan