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
PyObjectdeklariert, 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_REFCNTundPy_TYPE.-
Py_ssize_t ob_refcnt¶
- Teil der Stable ABI.
Die Referenzanzahl des Objekts, wie von
Py_REFCNTzurückgegeben. Verwenden Sie dieses Feld nicht direkt; verwenden Sie stattdessen Funktionen und Makros wiePy_REFCNT,Py_INCREF()undPy_DecRef().Der Feldtyp kann sich von
Py_ssize_tunterscheiden, 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_TYPEundPy_SET_TYPE().
-
Py_ssize_t ob_refcnt¶
-
type PyVarObject¶
- Teil der Limited API. (Nur einige Member sind Teil der stabilen ABI.)
Eine Erweiterung von
PyObject, die das Feldob_sizehinzufügt. Dies ist für Objekte gedacht, die eine Art von *Länge* haben.Wie bei
PyObjectdürfen die Member nicht direkt zugegriffen werden; stattdessen verwenden Sie Makros wiePy_SIZE,Py_REFCNTundPy_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 mitPy_SET_SIZEinob_sizegespeichert werden.Um die öffentlich exponierte Länge eines Objekts zu erhalten, wie sie von der Python-Funktion
len()zurückgegeben wird, verwenden Sie stattdessenPyObject_Length().
-
Py_ssize_t ob_size¶
-
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
PyObjectoben.
-
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
PyVarObjectoben.
-
PyTypeObject PyBaseObject_Type¶
- Teil der Stable ABI.
Die Basisklasse aller anderen Objekte, gleichbedeutend mit
objectin 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 yin 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 mitx is Nonein 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 mitx is Truein 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 mitx is Falsein 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.
-
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__mitPyObject_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_sizevon *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_sizevon *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 Feldesob_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
NULList, muss eine Ausnahme gesetzt worden sein. Wenn nichtNULL, 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_FASTCALLverwendet werden. Die Funktion hat die SignaturPyObject *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.
-
const char *ml_name¶
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
PyCFunctionhaben. 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 mitPyArg_ParseTuple()oderPyArg_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
PyCFunctionWithKeywordssein. Die Funktion erwartet drei Parameter: *self*, *args*, *kwargs*, wobei *kwargs* ein Dictionary aller Schlüsselwortargumente ist oder möglicherweiseNULL, wenn keine Schlüsselwortargumente vorhanden sind. Die Parameter werden typischerweise mitPyArg_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_FASTCALList nun Teil der stable ABI.
- METH_FASTCALL | METH_KEYWORDS
Erweiterung von
METH_FASTCALL, die auch Schlüsselwortargumente unterstützt, mit Methoden vom TypPyCFunctionFastWithKeywords. 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öglicherweiseNULList, 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
PyCMethodsein, wie beiMETH_FASTCALL | METH_KEYWORDSmit dem zusätzlichen Argumentdefining_classnachself.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_NOARGSaufgeführt sind. Sie müssen vom TypPyCFunctionsein. 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 ParameterNULL.Die Funktion muss 2 Parameter haben. Da der zweite Parameter nicht verwendet wird, kann
Py_UNUSEDverwendet werden, um eine Compiler-Warnung zu vermeiden.
-
METH_O¶
Methoden mit einem einzelnen Objektargument können mit dem Flag
METH_Oaufgeführt werden, anstattPyArg_ParseTuple()mit dem Argument"O"aufzurufen. Sie haben den TypPyCFunction, 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
NULLals ersten Parameter anstelle einer Instanz des Typs. Dies wird verwendet, um statische Methoden zu erstellen, ähnlich wie beim Verwenden der eingebauten Funktionstaticmethod().
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 kannNULLsein.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 aufNoneoderNULLgesetzt werden.Siehe auch
Der Parameter cls wird als Argument defining_class an die C-Funktion übergeben. Muss gesetzt sein, wenn
METH_METHODinml->ml_flagsgesetzt 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_STRdefiniert.
Standardmäßig (wenn
flags0ist) erlauben Member sowohl Lese- als auch Schreibzugriff. Verwenden Sie das FlagPy_READONLYfür schreibgeschützten Zugriff. Bestimmte Typen, wiePy_T_STRING, implizierenPy_READONLY. NurPy_T_OBJECT_EX(und ältereT_OBJECT) Member können gelöscht werden.Für Heap-allozierte Typen (erstellt mit
PyType_FromSpec()oder ähnlich) kannPyMemberDefeine Definition für den speziellen Member"__vectorcalloffset__"enthalten, entsprechendtp_vectorcall_offsetin Typobjekten. Dieser Member muss mitPy_T_PYSSIZETund entwederPy_READONLYoderPy_READONLY | Py_RELATIVE_OFFSETdefiniert 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üroffsetof()einschließen.)Die älteren Offsets
tp_dictoffsetundtp_weaklistoffsetkönnen ähnlich mit den Membern"__dictoffset__"und"__weaklistoffset__"definiert werden, aber Erweiterungen wird dringend empfohlen, stattdessenPy_TPFLAGS_MANAGED_DICTundPy_TPFLAGS_MANAGED_WEAKREFzu verwenden.Geändert in Version 3.12:
PyMemberDefist immer verfügbar. Zuvor erforderte es das Einbinden von"structmember.h".Geändert in Version 3.14:
Py_RELATIVE_OFFSETist nun für"__vectorcalloffset__","__dictoffset__"und"__weaklistoffset__"erlaubt. -
const char *name¶
-
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
PyMemberDefm beschrieben. Gibt bei einem FehlerNULLzurück.Geändert in Version 3.12:
PyMember_GetOneist 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
PyMemberDefm beschrieben. Gibt bei Erfolg0und bei Fehler einen negativen Wert zurück.Geändert in Version 3.12:
PyMember_SetOneist 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
offsetdiesesPyMemberDef-Eintrags ein Offset vom subklassen-spezifischen Daten ist, anstatt vonPyObject.Kann nur als Teil eines
Py_tp_membersslotbei der Erstellung einer Klasse mit negativembasicsizeverwendet werden. Er ist in diesem Fall zwingend erforderlich.Dieses Flag wird nur in
PyType_Slotverwendet. Beim Setzen vontp_memberswährend der Klassenerstellung löscht Python es und setztPyMemberDef.offsetauf den Offset von derPyObject-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 |
|---|---|---|
|
char |
|
|
short |
|
|
int |
|
|
long |
|
|
long long |
|
|
unsigned char |
|
|
unsigned int |
|
|
unsigned short |
|
|
unsigned long |
|
|
unsigned long long |
|
|
||
|
float |
|
|
double |
|
|
char (geschrieben als 0 oder 1) |
|
|
const char* (*) |
|
|
const char[] (*) |
|
|
char (0-127) |
|
|
|
(*): Null-terminierter, UTF8-kodierter C-String. Mit
Py_T_STRINGist die C-Darstellung ein Zeiger; mitPy_T_STRING_INPLACEwird 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
NULLgesetzt. Das Lesen einesNULL-Zeigers löstAttributeErroraus.
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, aberNULLwird inNonekonvertiert. Dies führt zu überraschendem Verhalten in Python: Das Löschen des Attributs setzt es effektiv aufNone.
-
T_NONE¶
Immer
None. Muss mitPy_READONLYverwendet 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_getsetSlots.-
const char *name¶
Attributname
-
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.
-
const char *name¶
-
typedef PyObject *(*getter)(PyObject*, void*)¶
- Teil der Stable ABI.
Die
get-Funktion nimmt einen PyObject*-Parameter (die Instanz) und einen Benutzerdatenzeiger (die zugehörigeclosure) entgegen.Sie sollte bei Erfolg eine neue Referenz oder bei einem Fehler
NULLmit 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örigeclosure) entgegen.Wenn das Attribut gelöscht werden soll, ist der zweite Parameter
NULL. Sollte bei Erfolg0oder bei einem Fehler-1mit einer gesetzten Ausnahme zurückgeben.