Sto solo iniziando a giocare con le estensioni Python C e sono curioso di sapere perché una funzione C, che può essere richiamata da Python, deve prendere 2 argomenti PyObject * e restituire un PyObject *. Ho scritto il seguente "Ciao Mondo" estensione:Estensioni Python C - Perché le funzioni C callable accettano argomenti e restituiscono 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);
}
Perché non posso (in particolare con METH_NOARGS) utilizzare il seguente metodo hello_world:
static void
hello_world()
{
printf("Hello World\n");
}
?
È 'Py_None', non' PyNone'. Inoltre c'è 'Py_RETURN_NONE' simile a' Py_RETURN_TRUE' e 'Py_RETURN_FALSE'. – yak
Per (3), correggimi se ho torto ma se il codice utilizzava una convenzione di chiamata in cui tutti gli argomenti vengono passati nello stack e il chiamato (la funzione) li fa fuori dallo stack, la rimozione dell'argomento non utilizzato causerebbe un errore arresto anomalo perché Python passerà sempre NULL come secondo argomento e la funzione non lo popolerà. – yak
@ yak Non provoca un arresto anomalo nel mio codice. – jogojapan