Zugriff auf die zugrunde liegende Struktur eines PyObjects

Ich arbeite an der Schaffung einer Python-C-Erweiterung, aber ich habe Schwierigkeiten, Dokumentation zu finden, was ich tun möchte. Ich möchte grundsätzlich einen Zeiger auf eine Anweisung erstellen und in der Lage sein, Zugriff auf diesen Zeiger zu haben. Der Beispielcode ist unten. Jede Hilfe wäre willkommen.

typedef struct{ int x; int y; } Point; typedef struct { PyObject_HEAD Point* my_point; } PointObject; static PyTypeObject PointType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "point", /*tp_name*/ sizeof(PointObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ "point objects", /* tp_doc */ }; static PyObject* set_point(PyObject* self, PyObject* args) { PyObject* point; if (!PyArg_ParseTuple(args, "O", &point)) { return NULL; } //code to access my_point } 

One Solution collect form web for “Zugriff auf die zugrunde liegende Struktur eines PyObjects”

Ihr PyArg_ParseTuple sollte kein Format verwenden O aber O! (Siehe die docs):

 O! (object) [typeobject, PyObject *] 

Speichern Sie ein Python-Objekt in einem C-Objektzeiger. Dies ist ähnlich wie O, nimmt aber zwei C-Argumente: Die erste ist die Adresse eines Python-Typs, die zweite ist die Adresse der C-Variablen (vom Typ PyObject *), in die der Objektzeiger gespeichert ist. Wenn das Python-Objekt nicht über den gewünschten Typ verfügt, wird TypeError angehoben.

Sobald du das getan hast, weißt du, dass in deiner Funktion der Körper (PointObject*)point ein korrekter und gültiger Zeiger auf ein PointObject , und deshalb ist sein ->my_point der Point* du ->my_point . Mit einem schlichten Format O musst du den Typ selbst überprüfen lassen.

Bearbeiten : das OP in einem Kommentar fragt nach der Quelle …:

 static PyObject* set_point(PyObject* self, PyObject* args) { PyObject* point; if (!PyArg_ParseTuple(args, "O!", &PointType, &point)) { return NULL; } Point* pp = ((PointObject*)point)->my_point; // ... use pp as the pointer to Point you were looking for... // ... and incidentally don't forget to return a properly incref'd // PyObject*, of course;-) } 
  • Python-Ctypen: Kopieren des Inhaltes der Struktur
  • Konvertieren Sie C-Array von Zeigern in Python-Array von Strukturen
  • Liste vs. int Zuweisung - "Jede Variable ist ein Zeiger"
  • Create_string_buffer throwing error TypError: str / bytes erwartet anstelle von str instance
  • Python ist die beste Programmiersprache der Welt.