Gängige Objektstrukturen

Es gibt eine Vielzahl von Strukturen, die in der Definition von Objekttypen für Python verwendet werden. Dieser Abschnitt beschreibt diese Strukturen und ihre Verwendung.

Basis-Objekttypen und Makros

Alle Python-Objekte teilen sich letztendlich wenige Felder am Anfang ihrer Speicherdarstellung. Diese werden durch die Typen PyObject und PyVarObject repräsentiert, die ihrerseits durch die Expansion einiger Makros definiert werden, die direkt oder indirekt zur Definition aller anderen Python-Objekte verwendet werden. Zusätzliche Makros finden Sie unter Referenzzählung.

type PyObject
Teil der Limited API. (Nur einige Member sind Teil der stabilen ABI.)

Alle Objekttypen sind Erweiterungen dieses Typs. Dies ist ein Typ, der die Informationen enthält, die Python benötigt, um einen Zeiger auf ein Objekt als Objekt zu behandeln. In einem normalen „Release“-Build enthält er nur die Referenzanzahl des Objekts und einen Zeiger auf das entsprechende Typobjekt. Nichts ist tatsächlich als PyObject deklariert, aber jeder Zeiger auf ein Python-Objekt kann in einen PyObject* umgewandelt werden.

Die Member dürfen nicht direkt zugegriffen werden; stattdessen verwenden Sie Makros wie Py_REFCNT und Py_TYPE.

Py_ssize_t ob_refcnt
Teil der Stable ABI.

Die Referenzanzahl des Objekts, wie von Py_REFCNT zurückgegeben. Verwenden Sie dieses Feld nicht direkt; verwenden Sie stattdessen Funktionen und Makros wie Py_REFCNT, Py_INCREF() und Py_DecRef().

Der Feldtyp kann sich von Py_ssize_t unterscheiden, abhängig von der Build-Konfiguration und der Plattform.

PyTypeObject *ob_type
Teil der Stable ABI.

Der Typ des Objekts. Greifen Sie nicht direkt auf dieses Feld zu; verwenden Sie stattdessen Py_TYPE und Py_SET_TYPE().

type PyVarObject
Teil der Limited API. (Nur einige Member sind Teil der stabilen ABI.)

Eine Erweiterung von PyObject, die das Feld ob_size hinzufügt. Dies ist für Objekte gedacht, die eine Art von *Länge* haben.

Wie bei PyObject dürfen die Member nicht direkt zugegriffen werden; stattdessen verwenden Sie Makros wie Py_SIZE, Py_REFCNT und Py_TYPE.

Py_ssize_t ob_size
Teil der Stable ABI.

Ein Größenfeld, dessen Inhalt als internes Implementierungsdetail eines Objekts betrachtet werden sollte.

Greifen Sie nicht direkt auf dieses Feld zu; verwenden Sie stattdessen Py_SIZE.

Objekterstellungsfunktionen wie PyObject_NewVar() setzen dieses Feld normalerweise auf die angeforderte Größe (Anzahl der Elemente). Nach der Erstellung können beliebige Werte mit Py_SET_SIZE in ob_size gespeichert werden.

Um die öffentlich exponierte Länge eines Objekts zu erhalten, wie sie von der Python-Funktion len() zurückgegeben wird, verwenden Sie stattdessen PyObject_Length().

PyObject_HEAD

Dies ist ein Makro, das beim Deklarieren neuer Typen verwendet wird, die Objekte ohne variierende Länge darstellen. Das Makro PyObject_HEAD expandiert zu

PyObject ob_base;

Siehe Dokumentation von PyObject oben.

PyObject_VAR_HEAD

Dies ist ein Makro, das beim Deklarieren neuer Typen verwendet wird, die Objekte mit einer variablen Länge von Instanz zu Instanz darstellen. Das Makro PyObject_VAR_HEAD expandiert zu

PyVarObject ob_base;

Siehe Dokumentation von PyVarObject oben.

PyTypeObject PyBaseObject_Type
Teil der Stable ABI.

Die Basisklasse aller anderen Objekte, gleichbedeutend mit object in Python.

int Py_Is(PyObject *x, PyObject *y)
Teil der Stable ABI seit Version 3.10.

Testet, ob das Objekt *x* das Objekt *y* ist, gleichbedeutend mit x is y in Python.

Hinzugefügt in Version 3.10.

int Py_IsNone(PyObject *x)
Teil der Stable ABI seit Version 3.10.

Testet, ob ein Objekt der None-Singleton ist, gleichbedeutend mit x is None in Python.

Hinzugefügt in Version 3.10.

int Py_IsTrue(PyObject *x)
Teil der Stable ABI seit Version 3.10.

Testet, ob ein Objekt der True-Singleton ist, gleichbedeutend mit x is True in Python.

Hinzugefügt in Version 3.10.

int Py_IsFalse(PyObject *x)
Teil der Stable ABI seit Version 3.10.

Testet, ob ein Objekt der False-Singleton ist, gleichbedeutend mit x is False in Python.

Hinzugefügt in Version 3.10.

PyTypeObject *Py_TYPE(PyObject *o)
Rückgabewert: Geliehene Referenz. Teil der Stable ABI seit Version 3.14.

Ruft den Typ des Python-Objekts *o* ab.

Die zurückgegebene Referenz ist *geliehen* von *o*. Geben Sie sie nicht mit Py_DECREF() oder ähnlichem frei.

Geändert in Version 3.11: Py_TYPE() wurde zu einer Inline-Static-Funktion geändert. Der Parametertyp ist nicht mehr const PyObject*.

int Py_IS_TYPE(PyObject *o, PyTypeObject *type)

Gibt ungleich Null zurück, wenn der Typ des Objekts *o* *type* ist. Gibt andernfalls Null zurück. Entspricht: Py_TYPE(o) == type.

Hinzugefügt in Version 3.9.

void Py_SET_TYPE(PyObject *o, PyTypeObject *type)

Setzt den Typ des Objekts *o* auf *type*, ohne Überprüfung oder Referenzzählung.

Dies ist eine sehr Low-Level-Operation. Ziehen Sie stattdessen das Setzen des Python-Attributs __class__ mit PyObject_SetAttrString() oder Ähnlichem in Betracht.

Beachten Sie, dass die Zuweisung eines inkompatiblen Typs zu undefiniertem Verhalten führen kann.

Wenn *type* ein Heap-Typ ist, muss der Aufrufer eine neue Referenz darauf erstellen. Ebenso muss der Aufrufer, wenn der alte Typ von *o* ein Heap-Typ ist, eine Referenz auf diesen Typ freigeben.

Hinzugefügt in Version 3.9.

Py_ssize_t Py_SIZE(PyVarObject *o)

Ruft das Feld ob_size von *o* ab.

Geändert in Version 3.11: Py_SIZE() wurde zu einer Inline-Static-Funktion geändert. Der Parametertyp ist nicht mehr const PyVarObject*.

void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)

Setzt das Feld ob_size von *o* auf *size*.

Hinzugefügt in Version 3.9.

PyObject_HEAD_INIT(type)

Dies ist ein Makro, das zu Initialisierungswerten für einen neuen PyObject-Typ expandiert. Dieses Makro expandiert zu

_PyObject_EXTRA_INIT
1, type,
PyVarObject_HEAD_INIT(type, size)

Dies ist ein Makro, das zu Initialisierungswerten für einen neuen PyVarObject-Typ expandiert, einschließlich des Feldes ob_size. Dieses Makro expandiert zu

_PyObject_EXTRA_INIT
1, type, size,

Implementierung von Funktionen und Methoden

type PyCFunction
Teil der Stable ABI.

Typ der Funktionen, die zur Implementierung der meisten Python-Aufrufbaren in C verwendet werden. Funktionen dieses Typs nehmen zwei PyObject*-Parameter entgegen und geben einen solchen Wert zurück. Wenn der Rückgabewert NULL ist, muss eine Ausnahme gesetzt worden sein. Wenn nicht NULL, wird der Rückgabewert als Rückgabewert der Funktion interpretiert, wie sie in Python exponiert wird. Die Funktion muss eine neue Referenz zurückgeben.

Die Funktion hat die Signatur

PyObject *PyCFunction(PyObject *self,
                      PyObject *args);
type PyCFunctionWithKeywords
Teil der Stable ABI.

Typ der Funktionen, die zur Implementierung von Python-Aufrufbaren in C mit der Signatur METH_VARARGS | METH_KEYWORDS verwendet werden. Die Funktion hat die Signatur

PyObject *PyCFunctionWithKeywords(PyObject *self,
                                  PyObject *args,
                                  PyObject *kwargs);
type PyCFunctionFast
Teil des Stable ABI seit Version 3.13.

Typ der Funktionen, die zur Implementierung von Python-Aufrufbaren in C mit der Signatur METH_FASTCALL verwendet werden. Die Funktion hat die Signatur

PyObject *PyCFunctionFast(PyObject *self,
                          PyObject *const *args,
                          Py_ssize_t nargs);
type PyCFunctionFastWithKeywords
Teil des Stable ABI seit Version 3.13.

Typ der Funktionen, die zur Implementierung von Python-Aufrufbaren in C mit der Signatur METH_FASTCALL | METH_KEYWORDS verwendet werden. Die Funktion hat die Signatur

PyObject *PyCFunctionFastWithKeywords(PyObject *self,
                                      PyObject *const *args,
                                      Py_ssize_t nargs,
                                      PyObject *kwnames);
type PyCMethod

Typ der Funktionen, die zur Implementierung von Python-Aufrufbaren in C mit der Signatur METH_METHOD | METH_FASTCALL | METH_KEYWORDS verwendet werden. Die Funktion hat die Signatur

PyObject *PyCMethod(PyObject *self,
                    PyTypeObject *defining_class,
                    PyObject *const *args,
                    Py_ssize_t nargs,
                    PyObject *kwnames)

Hinzugefügt in Version 3.9.

type PyMethodDef
Teil der Stable ABI (einschließlich aller Member).

Struktur, die zur Beschreibung einer Methode eines Erweiterungstyps verwendet wird. Diese Struktur hat vier Felder

const char *ml_name

Name der Methode.

PyCFunction ml_meth

Zeiger auf die C-Implementierung.

int ml_flags

Flags, die angeben, wie der Aufruf konstruiert werden soll.

const char *ml_doc

Zeigt auf den Inhalt des Docstrings.

Das Feld ml_meth ist ein C-Funktionszeiger. Die Funktionen können von unterschiedlichem Typ sein, aber sie geben immer PyObject* zurück. Wenn die Funktion nicht vom Typ PyCFunction ist, benötigt der Compiler in der Methodentabelle eine Umwandlung (Cast). Obwohl PyCFunction den ersten Parameter als PyObject* definiert, ist es üblich, dass die Methodenimplementierung den spezifischen C-Typ des *self*-Objekts verwendet.

Das Feld ml_flags ist ein Bitfeld, das die folgenden Flags enthalten kann. Die einzelnen Flags kennzeichnen entweder eine Aufrufkonvention oder eine Bindungskonvention.

Es gibt diese Aufrufkonventionen

METH_VARARGS

Dies ist die typische Aufrufkonvention, bei der die Methoden den Typ PyCFunction haben. Die Funktion erwartet zwei PyObject*-Werte. Der erste ist das *self*-Objekt für Methoden; für Modulfunktionen ist es das Modulobjekt. Der zweite Parameter (oft *args genannt) ist ein Tupelobjekt, das alle Argumente repräsentiert. Dieser Parameter wird typischerweise mit PyArg_ParseTuple() oder PyArg_UnpackTuple() verarbeitet.

METH_KEYWORDS

Kann nur in bestimmten Kombinationen mit anderen Flags verwendet werden: METH_VARARGS | METH_KEYWORDS, METH_FASTCALL | METH_KEYWORDS und METH_METHOD | METH_FASTCALL | METH_KEYWORDS.

METH_VARARGS | METH_KEYWORDS

Methoden mit diesen Flags müssen vom Typ PyCFunctionWithKeywords sein. Die Funktion erwartet drei Parameter: *self*, *args*, *kwargs*, wobei *kwargs* ein Dictionary aller Schlüsselwortargumente ist oder möglicherweise NULL, wenn keine Schlüsselwortargumente vorhanden sind. Die Parameter werden typischerweise mit PyArg_ParseTupleAndKeywords() verarbeitet.

METH_FASTCALL

Schnelle Aufrufkonvention, die nur positionale Argumente unterstützt. Die Methoden haben den Typ PyCFunctionFast. Der erste Parameter ist *self*, der zweite Parameter ist ein C-Array von PyObject*-Werten, die die Argumente angeben, und der dritte Parameter ist die Anzahl der Argumente (die Länge des Arrays).

Hinzugefügt in Version 3.7.

Geändert in Version 3.10: METH_FASTCALL ist nun Teil der stable ABI.

METH_FASTCALL | METH_KEYWORDS

Erweiterung von METH_FASTCALL, die auch Schlüsselwortargumente unterstützt, mit Methoden vom Typ PyCFunctionFastWithKeywords. Schlüsselwortargumente werden auf die gleiche Weise übergeben wie im vectorcall-Protokoll: Es gibt einen zusätzlichen vierten PyObject*-Parameter, der ein Tupel der Namen der Schlüsselwortargumente ist (die garantiert Strings sind) oder möglicherweise NULL ist, wenn keine Schlüsselwörter vorhanden sind. Die Werte der Schlüsselwortargumente werden im *args*-Array nach den Positionsargumenten gespeichert.

Hinzugefügt in Version 3.7.

METH_METHOD

Kann nur in der Kombination mit anderen Flags verwendet werden: METH_METHOD | METH_FASTCALL | METH_KEYWORDS.

METH_METHOD | METH_FASTCALL | METH_KEYWORDS

Erweiterung von METH_FASTCALL | METH_KEYWORDS, die auch die *definierende Klasse* unterstützt, d.h. die Klasse, die die betreffende Methode enthält. Die definierende Klasse kann eine Oberklasse von Py_TYPE(self) sein.

Die Methode muss vom Typ PyCMethod sein, wie bei METH_FASTCALL | METH_KEYWORDS mit dem zusätzlichen Argument defining_class nach self.

Hinzugefügt in Version 3.9.

METH_NOARGS

Methoden ohne Parameter müssen nicht prüfen, ob Argumente übergeben wurden, wenn sie mit dem Flag METH_NOARGS aufgeführt sind. Sie müssen vom Typ PyCFunction sein. Der erste Parameter wird üblicherweise self genannt und enthält einen Verweis auf das Modul oder die Objektinstanz. In allen Fällen ist der zweite Parameter NULL.

Die Funktion muss 2 Parameter haben. Da der zweite Parameter nicht verwendet wird, kann Py_UNUSED verwendet werden, um eine Compiler-Warnung zu vermeiden.

METH_O

Methoden mit einem einzelnen Objektargument können mit dem Flag METH_O aufgeführt werden, anstatt PyArg_ParseTuple() mit dem Argument "O" aufzurufen. Sie haben den Typ PyCFunction, mit dem self-Parameter und einem PyObject*-Parameter, der das einzelne Argument repräsentiert.

Diese beiden Konstanten werden nicht verwendet, um die Aufrufkonvention anzuzeigen, sondern die Bindung bei Verwendung mit Methoden von Klassen. Diese dürfen nicht für Funktionen verwendet werden, die für Module definiert sind. Maximal eines dieser Flags darf für eine gegebene Methode gesetzt sein.

METH_CLASS

Die Methode erhält das Typobjekt als ersten Parameter anstelle einer Instanz des Typs. Dies wird verwendet, um Klassenmethoden zu erstellen, ähnlich wie beim Verwenden der eingebauten Funktion classmethod().

METH_STATIC

Die Methode erhält NULL als ersten Parameter anstelle einer Instanz des Typs. Dies wird verwendet, um statische Methoden zu erstellen, ähnlich wie beim Verwenden der eingebauten Funktion staticmethod().

Eine weitere Konstante steuert, ob eine Methode anstelle einer anderen Definition mit demselben Methodennamen geladen wird.

METH_COEXIST

Die Methode wird anstelle bestehender Definitionen geladen. Ohne METH_COEXIST ist der Standard, wiederholte Definitionen zu überspringen. Da Slot-Wrapper vor der Methodentabelle geladen werden, würde die Existenz eines sq_contains-Slots beispielsweise eine gewrappte Methode namens __contains__() erzeugen und das Laden einer entsprechenden PyCFunction mit demselben Namen verhindern. Mit gesetztem Flag wird die PyCFunction anstelle des Wrapper-Objekts geladen und existiert neben dem Slot. Dies ist hilfreich, da Aufrufe von PyCFunctions stärker optimiert sind als Aufrufe von Wrapper-Objekten.

PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)
Rückgabewert: Neue Referenz. Teil der Stable ABI seit Version 3.9.

Wandelt ml in ein Python aufrufbares Objekt um. Der Aufrufer muss sicherstellen, dass ml länger existiert als das aufrufbare Objekt. Typischerweise wird ml als statische Variable definiert.

Der Parameter self wird als self-Argument an die C-Funktion in ml->ml_meth übergeben, wenn diese aufgerufen wird. self kann NULL sein.

Das Attribut __module__ des aufrufbaren Objekts kann aus dem übergebenen Argument module gesetzt werden. module sollte ein Python-String sein, der als Name des Moduls verwendet wird, in dem die Funktion definiert ist. Wenn nicht verfügbar, kann er auf None oder NULL gesetzt werden.

Siehe auch

function.__module__

Der Parameter cls wird als Argument defining_class an die C-Funktion übergeben. Muss gesetzt sein, wenn METH_METHOD in ml->ml_flags gesetzt ist.

Hinzugefügt in Version 3.9.

PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
Rückgabewert: Neue Referenz. Teil der Stabilen ABI.

Entspricht PyCMethod_New(ml, self, module, NULL).

PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)
Rückgabewert: Neue Referenz. Teil der Stable ABI seit Version 3.4.

Entspricht PyCMethod_New(ml, self, NULL, NULL).

Zugriff auf Attribute von Erweiterungstypen

type PyMemberDef
Teil der Stable ABI (einschließlich aller Member).

Struktur, die ein Attribut eines Typs beschreibt, der einem C-Strukturmember entspricht. Bei der Definition einer Klasse wird ein NULL-terminiertes Array dieser Strukturen in den tp_members-Slot gestellt.

Seine Felder sind in der Reihenfolge:

const char *name

Name des Members. Ein NULL-Wert markiert das Ende eines PyMemberDef[]-Arrays.

Der String sollte statisch sein, es wird keine Kopie davon gemacht.

int type

Der Typ des Members in der C-Struktur. Siehe Member-Typen für die möglichen Werte.

Py_ssize_t offset

Der Offset in Bytes, an dem sich der Member in der Objektstruktur des Typs befindet.

int flags

Null oder mehr der Member-Flags, kombiniert mittels bitweisem OR.

const char *doc

Der Docstring oder NULL. Der String sollte statisch sein, es wird keine Kopie davon gemacht. Typischerweise wird er mit PyDoc_STR definiert.

Standardmäßig (wenn flags 0 ist) erlauben Member sowohl Lese- als auch Schreibzugriff. Verwenden Sie das Flag Py_READONLY für schreibgeschützten Zugriff. Bestimmte Typen, wie Py_T_STRING, implizieren Py_READONLY. Nur Py_T_OBJECT_EX (und ältere T_OBJECT) Member können gelöscht werden.

Für Heap-allozierte Typen (erstellt mit PyType_FromSpec() oder ähnlich) kann PyMemberDef eine Definition für den speziellen Member "__vectorcalloffset__" enthalten, entsprechend tp_vectorcall_offset in Typobjekten. Dieser Member muss mit Py_T_PYSSIZET und entweder Py_READONLY oder Py_READONLY | Py_RELATIVE_OFFSET definiert werden. Zum Beispiel:

static PyMemberDef spam_type_members[] = {
    {"__vectorcalloffset__", Py_T_PYSSIZET,
     offsetof(Spam_object, vectorcall), Py_READONLY},
    {NULL}  /* Sentinel */
};

(Möglicherweise müssen Sie #include <stddef.h> für offsetof() einschließen.)

Die älteren Offsets tp_dictoffset und tp_weaklistoffset können ähnlich mit den Membern "__dictoffset__" und "__weaklistoffset__" definiert werden, aber Erweiterungen wird dringend empfohlen, stattdessen Py_TPFLAGS_MANAGED_DICT und Py_TPFLAGS_MANAGED_WEAKREF zu verwenden.

Geändert in Version 3.12: PyMemberDef ist immer verfügbar. Zuvor erforderte es das Einbinden von "structmember.h".

Geändert in Version 3.14: Py_RELATIVE_OFFSET ist nun für "__vectorcalloffset__", "__dictoffset__" und "__weaklistoffset__" erlaubt.

PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)
Teil der Stable ABI.

Ruft ein Attribut ab, das zum Objekt an der Adresse obj_addr gehört. Das Attribut wird durch PyMemberDef m beschrieben. Gibt bei einem Fehler NULL zurück.

Geändert in Version 3.12: PyMember_GetOne ist immer verfügbar. Zuvor erforderte es das Einbinden von "structmember.h".

int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)
Teil der Stable ABI.

Setzt ein Attribut, das zum Objekt an der Adresse obj_addr gehört, auf das Objekt o. Das zu setzende Attribut wird durch PyMemberDef m beschrieben. Gibt bei Erfolg 0 und bei Fehler einen negativen Wert zurück.

Geändert in Version 3.12: PyMember_SetOne ist immer verfügbar. Zuvor erforderte es das Einbinden von "structmember.h".

Member-Flags

Die folgenden Flags können mit PyMemberDef.flags verwendet werden

Py_READONLY

Nicht schreibbar.

Py_AUDIT_READ

Sendet ein object.__getattr__ Audit-Event vor dem Lesen.

Py_RELATIVE_OFFSET

Gibt an, dass der offset dieses PyMemberDef-Eintrags ein Offset vom subklassen-spezifischen Daten ist, anstatt von PyObject.

Kann nur als Teil eines Py_tp_members slot bei der Erstellung einer Klasse mit negativem basicsize verwendet werden. Er ist in diesem Fall zwingend erforderlich.

Dieses Flag wird nur in PyType_Slot verwendet. Beim Setzen von tp_members während der Klassenerstellung löscht Python es und setzt PyMemberDef.offset auf den Offset von der PyObject-Struktur.

Geändert in Version 3.10: Die Makros RESTRICTED, READ_RESTRICTED und WRITE_RESTRICTED, die mit #include "structmember.h" verfügbar sind, sind veraltet. READ_RESTRICTED und RESTRICTED entsprechen Py_AUDIT_READ; WRITE_RESTRICTED tut nichts.

Geändert in Version 3.12: Das Makro READONLY wurde in Py_READONLY umbenannt. Das Makro PY_AUDIT_READ wurde mit dem Präfix Py_ umbenannt. Die neuen Namen sind nun immer verfügbar. Zuvor erforderten diese #include "structmember.h". Die Header-Datei ist weiterhin verfügbar und stellt die alten Namen bereit.

Member-Typen

PyMemberDef.type kann eines der folgenden Makros sein, die verschiedenen C-Typen entsprechen. Wenn der Member in Python zugegriffen wird, wird er in den entsprechenden Python-Typ konvertiert. Wenn er aus Python gesetzt wird, wird er zurück in den C-Typ konvertiert. Wenn dies nicht möglich ist, wird eine Ausnahme wie TypeError oder ValueError ausgelöst.

Sofern nicht (D) markiert, können auf diese Weise definierte Attribute nicht mit z. B. del oder delattr() gelöscht werden.

Makroname

C-Typ

Python Typ

Py_T_BYTE

char

int

Py_T_SHORT

short

int

Py_T_INT

int

int

Py_T_LONG

long

int

Py_T_LONGLONG

long long

int

Py_T_UBYTE

unsigned char

int

Py_T_UINT

unsigned int

int

Py_T_USHORT

unsigned short

int

Py_T_ULONG

unsigned long

int

Py_T_ULONGLONG

unsigned long long

int

Py_T_PYSSIZET

Py_ssize_t

int

Py_T_FLOAT

float

float

Py_T_DOUBLE

double

float

Py_T_BOOL

char (geschrieben als 0 oder 1)

bool

Py_T_STRING

const char* (*)

str (RO)

Py_T_STRING_INPLACE

const char[] (*)

str (RO)

Py_T_CHAR

char (0-127)

str (**)

Py_T_OBJECT_EX

PyObject*

object (D)

(*): Null-terminierter, UTF8-kodierter C-String. Mit Py_T_STRING ist die C-Darstellung ein Zeiger; mit Py_T_STRING_INPLACE wird der String direkt in der Struktur gespeichert.

(**): String der Länge 1. Nur ASCII ist zulässig.

(RO): Impliziert Py_READONLY.

(D): Kann gelöscht werden, in diesem Fall wird der Zeiger auf NULL gesetzt. Das Lesen eines NULL-Zeigers löst AttributeError aus.

Hinzugefügt in Version 3.12: In früheren Versionen waren die Makros nur mit #include "structmember.h" verfügbar und hießen ohne das Präfix Py_ (z. B. als T_INT). Die Header-Datei ist weiterhin verfügbar und enthält die alten Namen sowie die folgenden veralteten Typen

T_OBJECT

Ähnlich wie Py_T_OBJECT_EX, aber NULL wird in None konvertiert. Dies führt zu überraschendem Verhalten in Python: Das Löschen des Attributs setzt es effektiv auf None.

T_NONE

Immer None. Muss mit Py_READONLY verwendet werden.

Getter und Setter definieren

type PyGetSetDef
Teil der Stable ABI (einschließlich aller Member).

Struktur zur Definition eines eigenschaftsähnlichen Zugriffs für einen Typ. Siehe auch die Beschreibung des PyTypeObject.tp_getset Slots.

const char *name

Attributname

getter get

C-Funktion zum Abrufen des Attributs.

setter set

Optionale C-Funktion zum Setzen oder Löschen des Attributs. Wenn NULL, ist das Attribut schreibgeschützt.

const char *doc

optionaler Docstring

void *closure

Optionaler Zeiger auf Benutzerdaten, der zusätzliche Daten für Getter und Setter bereitstellt.

typedef PyObject *(*getter)(PyObject*, void*)
Teil der Stable ABI.

Die get-Funktion nimmt einen PyObject*-Parameter (die Instanz) und einen Benutzerdatenzeiger (die zugehörige closure) entgegen.

Sie sollte bei Erfolg eine neue Referenz oder bei einem Fehler NULL mit einer gesetzten Ausnahme zurückgeben.

typedef int (*setter)(PyObject*, PyObject*, void*)
Teil der Stable ABI.

set-Funktionen nehmen zwei PyObject*-Parameter (die Instanz und der zu setzende Wert) und einen Benutzerdatenzeiger (die zugehörige closure) entgegen.

Wenn das Attribut gelöscht werden soll, ist der zweite Parameter NULL. Sollte bei Erfolg 0 oder bei einem Fehler -1 mit einer gesetzten Ausnahme zurückgeben.