Vanliga objektstrukturer¶
Det finns ett stort antal strukturer som används vid definitionen av objekttyper i Python. I detta avsnitt beskrivs dessa strukturer och hur de används.
Typer av basobjekt och makron¶
Alla Python-objekt delar i slutändan ett litet antal fält i början av objektets representation i minnet. Dessa representeras av typerna PyObject
och PyVarObject
, som i sin tur definieras av utvidgningarna av vissa makron som också används, direkt eller indirekt, i definitionen av alla andra Python-objekt. Ytterligare makron finns under referensräkning.
-
type PyObject¶
- En del av Begränsat API. (Endast vissa medlemmar ingår i det stabila ABI.)
Alla objekttyper är utvidgningar av denna typ. Detta är en typ som innehåller den information som Python behöver för att behandla en pekare till ett objekt som ett objekt. I en normal ”release”-byggnad innehåller den bara objektets referensantal och en pekare till motsvarande typobjekt. Ingenting är faktiskt deklarerat att vara ett
PyObject
, men varje pekare till ett Python-objekt kan castas till ett PyObject*.Medlemmarna får inte nås direkt; använd istället makron som
Py_REFCNT
ochPy_TYPE
.-
Py_ssize_t ob_refcnt¶
- En del av Stabil ABI.
Objektets referensantal, som returneras av
Py_REFCNT
. Använd inte detta fält direkt, utan använd istället funktioner och makron somPy_REFCNT
,Py_INCREF()
ochPy_DecRef()
.Fälttypen kan skilja sig från
Py_ssize_t
, beroende på byggkonfiguration och plattform.
-
PyTypeObject *ob_type¶
- En del av Stabil ABI.
Objektets typ. Använd inte detta fält direkt; använd
Py_TYPE
ochPy_SET_TYPE()
istället.
-
Py_ssize_t ob_refcnt¶
-
type PyVarObject¶
- En del av Begränsat API. (Endast vissa medlemmar ingår i det stabila ABI.)
En utökning av
PyObject
som lägger till fältetob_size
. Detta är avsett för objekt som har någon uppfattning om längd.Precis som med
PyObject
får medlemmarna inte nås direkt; använd istället makron somPy_SIZE
,Py_REFCNT
ochPy_TYPE
.-
Py_ssize_t ob_size¶
- En del av Stabil ABI.
Ett storleksfält, vars innehåll bör betraktas som ett objekts interna implementeringsdetaljer.
Använd inte detta fält direkt utan använd istället
Py_SIZE
.Objektskapande funktioner som
PyObject_NewVar()
kommer i allmänhet att sätta detta fält till den begärda storleken (antal objekt). Efter skapandet kan godtyckliga värden lagras iob_size
med hjälp avPy_SET_SIZE
.För att få ett objekts offentligt exponerade längd, som returneras av Python-funktionen
len()
, använder du iställetPyObject_Length()
.
-
Py_ssize_t ob_size¶
-
PyObject_HEAD¶
Detta är ett makro som används vid deklaration av nya typer som representerar objekt utan varierande längd. PyObject_HEAD-makrot expanderar till:
PyObject ob_base;
Se dokumentation av
PyObject
ovan.
-
PyObject_VAR_HEAD¶
Detta är ett makro som används vid deklaration av nya typer som representerar objekt med en längd som varierar från instans till instans. Makrot PyObject_VAR_HEAD expanderar till:
PyVarObject ob_base;
Se dokumentation av
PyVarObject
ovan.
-
PyTypeObject PyBaseObject_Type¶
- En del av Stabil ABI.
Basklassen för alla andra objekt, samma sak som
object
i Python.
-
int Py_Is(PyObject *x, PyObject *y)¶
- En del av Stabil ABI sedan version 3.10.
Testar om x-objektet är y-objektet, på samma sätt som
x is y
i Python.Tillagd i version 3.10.
-
int Py_IsNone(PyObject *x)¶
- En del av Stabil ABI sedan version 3.10.
Testar om ett objekt är singleton
None
, samma sak somx is None
i Python.Tillagd i version 3.10.
-
int Py_IsTrue(PyObject *x)¶
- En del av Stabil ABI sedan version 3.10.
Testar om ett objekt är
True
singleton, på samma sätt somx is True
i Python.Tillagd i version 3.10.
-
int Py_IsFalse(PyObject *x)¶
- En del av Stabil ABI sedan version 3.10.
Testar om ett objekt är
False
singleton, samma sak somx is False
i Python.Tillagd i version 3.10.
-
PyTypeObject *Py_TYPE(PyObject *o)¶
- Returnera värde: Lånad referens. En del av Stabil ABI sedan version 3.14.
Hämta typen av Python-objekt o.
Den returnerade referensen är borrowed från o. Frigör den inte med
Py_DECREF()
eller liknande.
-
int Py_IS_TYPE(PyObject *o, PyTypeObject *type)¶
Returnerar icke-noll om objektets o typ är type. Returnerar noll annars. Likvärdig med:
Py_TYPE(o) == typ
.Tillagd i version 3.9.
-
void Py_SET_TYPE(PyObject *o, PyTypeObject *type)¶
Sätt typen av objekt o till typ, utan kontroll eller referensräkning.
Detta är en operation på mycket låg nivå. Överväg istället att ställa in Python-attributet
__class__
med hjälp avPyObject_SetAttrString()
eller liknande.Observera att om du tilldelar en inkompatibel typ kan det leda till ett odefinierat beteende.
Om typ är en heap-typ, måste anroparen skapa en ny referens till den. På samma sätt, om den gamla typen av o är en heap-typ, måste den som anropar frigöra en referens till den typen.
Tillagd i version 3.9.
-
Py_ssize_t Py_SIZE(PyVarObject *o)¶
Hämta fältet
ob_size
för o.Ändrad i version 3.11:
Py_SIZE()
är ändrad till en inline statisk funktion. Parametertypen är inte längre const PyVarObject*.
-
void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)¶
Sätt fältet
ob_size
i o till size.Tillagd i version 3.9.
-
PyObject_HEAD_INIT(type)¶
Detta är ett makro som expanderar till initialiseringsvärden för en ny
PyObject
-typ. Detta makro expanderar till:_PyObjekt_EXTRA_INIT 1, typ,
-
PyVarObject_HEAD_INIT(type, size)¶
Detta är ett makro som expanderar till initialiseringsvärden för en ny
PyVarObject
-typ, inklusive fältetob_size
. Detta makro expanderar till:_PyObjekt_EXTRA_INIT 1, typ, storlek,
Implementering av funktioner och metoder¶
-
type PyCFunction¶
- En del av Stabil ABI.
Typ av funktioner som används för att implementera de flesta Python-kallelser i C. Funktioner av denna typ tar två PyObject*-parametrar och returnerar ett sådant värde. Om returvärdet är
NULL
skall ett undantag ha ställts in. Om det inte ärNULL
tolkas returvärdet som returvärdet för funktionen som den exponeras i Python. Funktionen måste returnera en ny referens.Funktionens signatur är:
PyObject *PyCFunction(PyObject *self, PyObject *args);
-
type PyCFunctionWithKeywords¶
- En del av Stabil ABI.
Typ av de funktioner som används för att implementera Python callables i C med signaturen METH_VARARGS | METH_KEYWORDS. Funktionssignaturen är:
PyObject *PyCFunctionWithKeywords(PyObject *self, PyObject *args, PyObject *kwargs);
-
type PyCFunctionFast¶
- En del av Stabil ABI sedan version 3.13.
Typ av de funktioner som används för att implementera Python callables i C med signaturen
METH_FASTCALL
. Funktionens signatur är:PyObject *PyCFunctionFast(PyObject *self, PyObject *const *args, Py_ssize_t nargs);
-
type PyCFunctionFastWithKeywords¶
- En del av Stabil ABI sedan version 3.13.
Typ av de funktioner som används för att implementera Python callables i C med signaturen METH_FASTCALL | METH_KEYWORDS. Funktionssignaturen är:
PyObject *PyCFunctionFastWithKeywords(PyObject *self, PyObject *konst *args, Py_ssize_t nargs, PyObject *kwnamn);
-
type PyCMethod¶
Typ av de funktioner som används för att implementera Python callables i C med signaturen METH_METHOD | METH_FASTCALL | METH_KEYWORDS. Funktionssignaturen är:
PyObject *PyCMethod(PyObject *self, PyTypeObject *definierande_klass, PyObject *konst *args, Py_ssize_t nargs, PyObject *kwnamn)
Tillagd i version 3.9.
-
type PyMethodDef¶
- En del av Stabil ABI (inklusive alla medlemmar).
Struktur som används för att beskriva en metod för en tilläggstyp. Denna struktur har fyra fält:
-
const char *ml_name¶
Namn på metoden.
-
PyCFunction ml_meth¶
Pekare till C-implementeringen.
-
int ml_flags¶
Flaggbitar som anger hur anropet ska konstrueras.
-
const char *ml_doc¶
Pekar på innehållet i dokumentsträngen.
-
const char *ml_name¶
ml_meth
är en C-funktionspekare. Funktionerna kan vara av olika typer, men de returnerar alltid PyObject*. Om funktionen inte är av typen PyCFunction
, kommer kompilatorn att kräva en cast i metodtabellen. Även om PyCFunction
definierar den första parametern som PyObject*, är det vanligt att metodimplementeringen använder den specifika C-typen för self-objektet.
Fältet ml_flags
är ett bitfält som kan innehålla följande flaggor. De enskilda flaggorna anger antingen en anropskonvention eller en bindningskonvention.
Det finns dessa samtalskonventioner:
-
METH_VARARGS¶
Detta är den typiska anropskonventionen, där metoderna har typen
PyCFunction
. Funktionen förväntar sig två PyObject*-värden. Det första är self-objektet för metoder; för modulfunktioner är det modulobjektet. Den andra parametern (ofta kallad args) är ett tuple-objekt som representerar alla argument. Den här parametern bearbetas vanligtvis medPyArg_ParseTuple()
ellerPyArg_UnpackTuple()
.
-
METH_KEYWORDS¶
Kan endast användas i vissa kombinationer med andra flaggor: METH_VARARGS | METH_KEYWORDS, METH_FASTCALL | METH_KEYWORDS och METH_METHOD | METH_FASTCALL | METH_KEYWORDS.
- METH_VARARGS | METH_KEYWORDS
Metoder med dessa flaggor måste vara av typen
PyCFunctionWithKeywords
. Funktionen förväntar sig tre parametrar: self, args, kwargs där kwargs är en dictionary med alla nyckelordsargument eller eventuelltNULL
om det inte finns några nyckelordsargument. Parametrarna bearbetas vanligtvis medPyArg_ParseTupleAndKeywords()
.
-
METH_FASTCALL¶
Snabb anropskonvention som endast stöder positionella argument. Metoderna har typen
PyCFunctionFast
. Den första parametern är self, den andra parametern är en C-array av PyObject*-värden som anger argumenten och den tredje parametern är antalet argument (längden på arrayen).Tillagd i version 3.7.
Ändrad i version 3.10:
METH_FASTCALL
är nu en del av stable ABI.
- METH_FASTCALL | METH_KEYWORDS
Utökning av
METH_FASTCALL
som även stöder nyckelordsargument, med metoder av typenPyCFunctionFastWithKeywords
. Nyckelordsargument skickas på samma sätt som i vectorcall-protokollet: det finns en ytterligare fjärde PyObject*-parameter som är en tupel som representerar namnen på nyckelordsargumenten (som garanterat är strängar) eller eventuelltNULL
om det inte finns några nyckelord. Värdena på nyckelordsargumenten lagras i args-arrayen, efter de positionella argumenten.Tillagd i version 3.7.
-
METH_METHOD¶
Kan endast användas i kombination med andra flaggor: METH_METHOD | METH_FASTCALL | METH_KEYWORDS.
- METH_METHOD | METH_FASTCALL | METH_KEYWORDS
Utökning av METH_FASTCALL | METH_KEYWORDS som stöder den definierande klassen, det vill säga den klass som innehåller metoden i fråga. Den definierande klassen kan vara en superklass av
Py_TYPE(self)
.Metoden måste vara av typen
PyCMethod
, på samma sätt som förMETH_FASTCALL | METH_KEYWORDS
meddefining_class
argumentet tillagt efterself
.Tillagd i version 3.9.
-
METH_NOARGS¶
Metoder utan parametrar behöver inte kontrollera om argument ges om de listas med flaggan
METH_NOARGS
. De måste vara av typenPyCFunction
. Den första parametern har vanligtvis namnet self och innehåller en referens till modulen eller objektinstansen. I samtliga fall kommer den andra parametern att varaNULL
.Funktionen måste ha 2 parametrar. Eftersom den andra parametern är oanvänd kan
Py_UNUSED
användas för att förhindra en kompilatorvarning.
-
METH_O¶
Metoder med ett enda objektargument kan listas med flaggan
METH_O
, istället för att anropaPyArg_ParseTuple()
med ett"O"
-argument. De är av typenPyCFunction
, med parametern self och en parameter av typen PyObject* som representerar det enda argumentet.
Dessa två konstanter används inte för att ange anropskonventionen utan bindningen när de används med metoder för klasser. De får inte användas för funktioner som definieras för moduler. Högst en av dessa flaggor får vara inställd för en viss metod.
-
METH_CLASS¶
Metoden kommer att få typobjektet som första parameter i stället för en instans av typen. Detta används för att skapa klassmetoder, liknande det som skapas när man använder den inbyggda funktionen
classmethod()
.
-
METH_STATIC¶
Metoden får
NULL
som första parameter i stället för en instans av typen. Detta används för att skapa statiska metoder, liknande det som skapas när man använder den inbyggda funktionenstaticmethod()
.
En annan konstant styr om en metod ska laddas i stället för en annan definition med samma metodnamn.
-
METH_COEXIST¶
Metoden kommer att laddas i stället för befintliga definitioner. Utan METH_COEXIST är standardinställningen att hoppa över upprepade definitioner. Eftersom slot-omslag laddas före metodtabellen, skulle till exempel förekomsten av en sq_contains slot generera en omslagsmetod med namnet
__contains__()
och förhindra laddning av en motsvarande PyCFunction med samma namn. Med flaggan definierad kommer PyCFunktionen att laddas i stället för omslutningsobjektet och kommer att samexistera med slotten. Detta är användbart eftersom anrop till PyCFunktioner optimeras mer än anrop till omslagsobjekt.
-
PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)¶
- Returnera värde: Ny referens. En del av Stabil ABI sedan version 3.9.
Gör ml till ett Python callable-objekt. Den som anropar måste se till att ml överlever callable. Vanligtvis är ml definierad som en statisk variabel.
Parametern self kommer att skickas som argumentet self till C-funktionen i
ml->ml_meth
när den anropas. self kan varaNULL
.Attributet
__module__
för objektet callable kan ställas in från det givna argumentet module. module bör vara en Python-sträng, som kommer att användas som namn på den modul som funktionen definieras i. Om den inte är tillgänglig kan den sättas tillNone
ellerNULL
.Se även
funktion.__modul__
Parametern cls kommer att skickas som argumentet defining_class till C-funktionen. Måste sättas om
METH_METHOD
är satt påml->ml_flags
.Tillagd i version 3.9.
-
PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)¶
- Returnera värde: Ny referens. En del av Stabil ABI.
Motsvarar
PyCMethod_New(ml, self, module, NULL)
.
-
PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)¶
- Returnera värde: Ny referens. En del av Stabil ABI sedan version 3.4.
Motsvarar
PyCMethod_New(ml, self, NULL, NULL)
.
Tillgång till attribut för tilläggstyper¶
-
type PyMemberDef¶
- En del av Stabil ABI (inklusive alla medlemmar).
Struktur som beskriver ett attribut av en typ som motsvarar en C struct-medlem. När du definierar en klass lägger du in en NULL-terminerad array av dessa strukturer i
tp_members
slot.Dess fält är i tur och ordning:
-
const char *name¶
Namnet på medlemmen. Ett NULL-värde markerar slutet på en
PyMemberDef[]
-array.Strängen ska vara statisk, ingen kopia görs av den.
-
int type¶
Typen av medlemmen i C-strukturen. Se Typer av medlemmar för de möjliga värdena.
-
Py_ssize_t offset¶
Den offset i bytes som medlemmen befinner sig på i typens objektstruktur.
-
int flags¶
Noll eller flera av Flaggor för medlemmar, kombinerade med bitvis OR.
-
const char *doc¶
Dokumentsträngen, eller NULL. Strängen ska vara statisk, ingen kopia görs av den. Vanligtvis definieras den med hjälp av
PyDoc_STR
.
Som standard (när
flags
är0
) tillåter medlemmar både läs- och skrivåtkomst. Använd flagganPy_READONLY
för skrivskyddad åtkomst. Vissa typer, somPy_T_STRING
, innebärPy_READONLY
. EndastPy_T_OBJECT_EX
(och äldreT_OBJECT
) medlemmar kan tas bort.För heap-allokerade typer (skapade med
PyType_FromSpec()
eller liknande) kanPyMemberDef
innehålla en definition för den speciella medlemmen"__vectorcalloffset__"
, motsvarandetp_vectorcall_offset
i typobjekt. Denna medlem måste definieras medPy_T_PYSSIZET
, och antingenPy_READONLY
ellerPy_READONLY | Py_RELATIVE_OFFSET
. Till exempel:static PyMemberDef spam_type_members[] = { {"__vectorcalloffset__", Py_T_PYSSIZET, offsetof(Spam_object, vectorcall), Py_READONLY}, {NULL} /* Sentinel */ };
(Du kan behöva
#include <stddef.h>
föroffsetof()
.)De äldre offseten
tp_dictoffset
ochtp_weaklistoffset
kan definieras på liknande sätt med hjälp av medlemmarna"__dictoffset__"
och"__weaklistoffset__"
, men tillägg uppmuntras starkt att användaPy_TPFLAGS_MANAGED_DICT
ochPy_TPFLAGS_MANAGED_WEAKREF
istället.Ändrad i version 3.12:
PyMemberDef
är alltid tillgänglig. Tidigare krävdes det att man inkluderade"structmember.h"
.Ändrad i version 3.14:
Py_RELATIVE_OFFSET
är nu tillåtet för"__vectorcalloffset__"
,"__dictoffset__"
och"__weaklistoffset__"
. -
const char *name¶
-
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)¶
- En del av Stabil ABI.
Hämtar ett attribut som tillhör objektet på adressen obj_addr. Attributet beskrivs av
PyMemberDef
m. ReturnerarNULL
vid fel.Ändrad i version 3.12:
PyMember_GetOne
är alltid tillgänglig. Tidigare krävdes det att man inkluderade"structmember.h"
.
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)¶
- En del av Stabil ABI.
Ställ in ett attribut som tillhör objektet på adressen obj_addr till objektet o. Attributet som ska ställas in beskrivs av
PyMemberDef
m. Returnerar0
om det lyckas och ett negativt värde om det misslyckas.Ändrad i version 3.12:
PyMember_SetOne
är alltid tillgänglig. Tidigare krävdes det att man inkluderade"structmember.h"
.
Flaggor för medlemmar¶
Följande flaggor kan användas med PyMemberDef.flags
:
-
Py_READONLY¶
Ej skrivbar.
-
Py_AUDIT_READ¶
Skicka en
object.__getattr__
audit event före läsning.
-
Py_RELATIVE_OFFSET¶
Indikerar att
offset
i dennaPyMemberDef
-post anger en förskjutning från den underklassspecifika datan, snarare än frånPyObject
.Kan endast användas som en del av
Py_tp_members
slot
när man skapar en klass med negativbasicsize
. Det är obligatoriskt i det fallet.Denna flagga används endast i
PyType_Slot
. När du ställer intp_members
under skapandet av klassen, rensar Python den och ställer inPyMemberDef.offset
till offset frånPyObject
-strukturen.
Ändrad i version 3.10: Makron RESTRICTED
, READ_RESTRICTED
och WRITE_RESTRICTED
som är tillgängliga med #include "structmember.h"
är föråldrade. READ_RESTRICTED
och RESTRICTED
är likvärdiga med Py_AUDIT_READ
; WRITE_RESTRICTED
gör ingenting.
Ändrad i version 3.12: Makrot READONLY
döptes om till Py_READONLY
. Makrot PY_AUDIT_READ
döptes om med prefixet Py_
. De nya namnen är nu alltid tillgängliga. Tidigare krävde dessa #include "structmember.h"
. Headern är fortfarande tillgänglig och den innehåller de gamla namnen.
Typer av medlemmar¶
PyMemberDef.type
kan vara ett av följande makron som motsvarar olika C-typer. När medlemmen används i Python konverteras den till motsvarande Python-typ. När den sätts från Python konverteras den tillbaka till C-typen. Om det inte är möjligt, kommer ett undantag som TypeError
eller ValueError
att uppstå.
Om inte markerat (D), kan attribut som definieras på detta sätt inte raderas med t.ex. del
eller delattr()
.
Namn på makro |
C-typ |
Python-typ |
---|---|---|
|
char |
|
|
short |
|
|
int |
|
|
long |
|
|
long long |
|
|
unsigned char |
|
|
unsigned int |
|
|
unsigned short |
|
|
unsigned long |
|
|
unsigned long long |
|
|
||
|
float |
|
|
double |
|
|
char (skrivs som 0 eller 1) |
|
|
const char* (*) |
|
|
const char[] (*) |
|
|
char (0-127) |
|
|
|
(*): Nollavslutad, UTF8-kodad C-sträng. Med
Py_T_STRING
är C-representationen en pekare; medPy_T_STRING_INPLACE
lagras strängen direkt i strukturen.(**): Sträng med längden 1. Endast ASCII accepteras.
(RO): Innebär
Py_READONLY
.(D): Kan raderas, i vilket fall pekaren sätts till
NULL
. Att läsa enNULL
pekare ger upphov tillAttributeError
.
Tillagd i version 3.12: I tidigare versioner var makron endast tillgängliga med #include "structmember.h"
och namngavs utan prefixet Py_
(t.ex. som T_INT
). Headern är fortfarande tillgänglig och innehåller de gamla namnen, tillsammans med följande föråldrade typer:
-
T_OBJECT¶
Som
Py_T_OBJECT_EX
, menNULL
konverteras tillNone
. Detta resulterar i ett överraskande beteende i Python: att ta bort attributet sätter det effektivt tillNone
.
-
T_NONE¶
Alltid
None
. Måste användas medPy_READONLY
.
Definiera Getters och Setters¶
-
type PyGetSetDef¶
- En del av Stabil ABI (inklusive alla medlemmar).
Struktur för att definiera egendomsliknande åtkomst för en typ. Se även beskrivning av
PyTypeObject.tp_getset
slot.-
const char *name¶
attributets namn
-
setter set¶
Valfri C-funktion för att ställa in eller ta bort attributet. Om
NULL
, är attributet skrivskyddat.
-
const char *doc¶
valfri dokumentsträng
-
void *closure¶
Valfri användardatapekare som tillhandahåller ytterligare data för getter och setter.
-
const char *name¶
-
typedef PyObject *(*getter)(PyObject*, void*)¶
- En del av Stabil ABI.
Funktionen
get
tar en PyObject*-parameter (instansen) och en användardatapekare (den tillhörandeclosure
):Den ska returnera en ny referens om den lyckas eller
NULL
med ett definierat undantag om den misslyckas.
-
typedef int (*setter)(PyObject*, PyObject*, void*)¶
- En del av Stabil ABI.
set
funktioner tar två PyObject* parametrar (instansen och värdet som ska ställas in) och en användardatapekare (den tillhörandeclosure
):Om attributet ska tas bort är den andra parametern
NULL
. Bör returnera0
vid framgång eller-1
med ett angivet undantag vid misslyckande.