Ich fange gerade an, mit Python C Erweiterungen zu spielen und bin gespannt, warum eine C-Funktion, die von Python aufgerufen werden kann, 2 PyObject * Argumente benötigt und gib ein PyObject * zurück. Ich schrieb die folgende "Hallo Welt" Erweiterung:Python C Extensions - Warum müssen aufrufbare C-Funktionen Argumente annehmen und PyObject zurückgeben *
#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);
}
Warum kann ich nicht (vor allem mit METH_NOARGS) verwenden Sie die folgende hello_world Methode:
static void
hello_world()
{
printf("Hello World\n");
}
?
Es ist 'Py_None', nicht' PyNone'. Außerdem gibt es 'Py_RETURN_NONE', ähnlich wie' Py_RETURN_TRUE' und 'Py_RETURN_FALSE'. – yak
Für (3), korrigieren Sie mich, wenn ich falsch liege, aber wenn der Code eine Aufrufkonvention verwendet, bei der alle Argumente auf dem Stapel übergeben werden und der Aufrufer (die Funktion) sie aus dem Stapel löscht, würde das Entfernen des unbenutzten Arguments a verursachen abstürzen, weil Python als zweites Argument immer NULL übergibt und die Funktion es nicht aufgibt. – yak
@yak Es verursacht keinen Absturz in meinem Code. – jogojapan