Kodobjekt¶
Kodobjekt är en detalj på låg nivå i CPython-implementeringen. Var och en representerar en bit körbar kod som ännu inte har bundits till en funktion.
-
type PyCodeObject¶
C-strukturen för de objekt som används för att beskriva kodobjekt. Fälten av denna typ kan ändras när som helst.
-
PyTypeObject PyCode_Type¶
Detta är en instans av
PyTypeObject
som representerar Python code object.
-
int PyCode_Check(PyObject *co)¶
Returnerar true om co är ett kodobjekt. Denna funktion lyckas alltid.
-
Py_ssize_t PyCode_GetNumFree(PyCodeObject *co)¶
Returnera antalet fria (stängda) variabler i ett kodobjekt.
-
int PyUnstable_Code_GetFirstFree(PyCodeObject *co)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Returnerar positionen för den första fria (stängda) variabeln i ett kodobjekt.
Ändrad i version 3.13: Bytt namn från
PyCode_GetFirstFree
som en del av Instabilt C API. Det gamla namnet är föråldrat, men kommer att finnas kvar tills signaturen ändras igen.
-
PyCodeObject *PyUnstable_Code_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Returnerar ett nytt kodobjekt. Om du behöver ett dummy-kodobjekt för att skapa en ram, använd
PyCode_NewEmpty()
istället.Eftersom definitionen av bytekoden ändras ofta kan ett direkt anrop av
PyUnstable_Code_New()
binda dig till en exakt Python-version.De många argumenten i denna funktion är beroende av varandra på ett komplext sätt, vilket innebär att små förändringar av värdena sannolikt leder till felaktigt utförande eller VM-krascher. Använd denna funktion endast med yttersta försiktighet.
Ändrad i version 3.11: Lagt till parametrarna
qualname
ochexceptiontable
.Ändrad i version 3.12: Bytt namn från
PyCode_New
som en del av Instabilt C API. Det gamla namnet är föråldrat, men kommer att finnas kvar tills signaturen ändras igen.
-
PyCodeObject *PyUnstable_Code_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Liknar
PyUnstable_Code_New()
, men med ett extra ”posonlyargcount” för enbart positionella argument. Samma varningar som gäller förPyUnstable_Code_New
gäller också för denna funktion.Tillagd i version 3.8: som
PyCode_NewWithPosOnlyArgs
Ändrad i version 3.11: Lagt till parametrarna
qualname
ochexceptiontable
.Ändrad i version 3.12: Bytt namn till
PyUnstable_Code_NewWithPosOnlyArgs
. Det gamla namnet är föråldrat, men kommer att finnas kvar tills signaturen ändras igen.
-
PyCodeObject *PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)¶
- Returnera värde: Ny referens.
Returnerar ett nytt tomt kodobjekt med angivet filnamn, funktionsnamn och första radnummer. Det resulterande kodobjektet kommer att ge upphov till ett
Exception
om det körs.
-
int PyCode_Addr2Line(PyCodeObject *co, int byte_offset)¶
Returnerar radnumret för den instruktion som börjar på eller före
byte_offset
och slutar efter den. Om du bara behöver radnumret för en frame, användPyFrame_GetLineNumber()
istället.För effektiv iterering över radnumren i ett kodobjekt, använd det API som beskrivs i PEP 626.
-
int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)¶
Ställer in de överlämnade
int
-pekarna till källkodens rad- och kolumnnummer för instruktionen vidbyte_offset
. Sätter värdet till0
när information inte är tillgänglig för något särskilt element.Returnerar
1
om funktionen lyckas och 0 annars.Tillagd i version 3.11.
-
PyObject *PyCode_GetCode(PyCodeObject *co)¶
Motsvarar Python-koden
getattr(co, 'co_code')
. Returnerar en stark referens till ettPyBytesObject
som representerar bytekoden i ett kodobjekt. Vid fel returnerasNULL
och ett undantag tas upp.Detta
PyBytesObject
kan skapas på begäran av tolken och representerar inte nödvändigtvis den bytekod som faktiskt exekveras av CPython. Det primära användningsområdet för denna funktion är debuggers och profilerare.Tillagd i version 3.11.
-
PyObject *PyCode_GetVarnames(PyCodeObject *co)¶
Motsvarar Python-koden
getattr(co, 'co_varnames')
. Returnerar en ny referens till ettPyTupleObject
som innehåller namnen på de lokala variablerna. Vid fel returnerasNULL
och ett undantag tas upp.Tillagd i version 3.11.
-
PyObject *PyCode_GetCellvars(PyCodeObject *co)¶
Motsvarar Python-koden
getattr(co, 'co_cellvars')
. Returnerar en ny referens till ettPyTupleObject
som innehåller namnen på de lokala variabler som refereras av nästlade funktioner. Vid fel returnerasNULL
och ett undantag tas upp.Tillagd i version 3.11.
-
PyObject *PyCode_GetFreevars(PyCodeObject *co)¶
Motsvarar Python-koden
getattr(co, 'co_freevars')
. Returnerar en ny referens till ettPyTupleObject
som innehåller namnen på free (closure) variables. Vid fel returnerasNULL
och ett undantag tas upp.Tillagd i version 3.11.
-
int PyCode_AddWatcher(PyCode_WatchCallback callback)¶
Registrera callback som en kodobjektsövervakare för den aktuella tolken. Returnerar ett ID som kan skickas till
PyCode_ClearWatcher()
. I händelse av fel (t.ex. inga fler ID:n tillgängliga), returnera-1
och sätt ett undantag.Tillagd i version 3.12.
-
int PyCode_ClearWatcher(int watcher_id)¶
Rensa en övervakare identifierad av watcher_id som tidigare returnerats från
PyCode_AddWatcher()
för den aktuella tolken. Returnerar0
vid framgång, eller-1
och anger ett undantag vid fel (t.ex. om det givna watcher_id aldrig registrerades)Tillagd i version 3.12.
-
type PyCodeEvent¶
Uppräkning av möjliga händelser för kodobjektsövervakare: -
PY_CODE_EVENT_CREATE
-PY_CODE_EVENT_DESTROY
-PY_CODE_EVENT_DESTROY
Tillagd i version 3.12.
-
typedef int (*PyCode_WatchCallback)(PyCodeEvent event, PyCodeObject *co)¶
Typ av återuppringningsfunktion för en kodobjektsövervakare.
Om event är
PY_CODE_EVENT_CREATE
, anropas återuppringningen efter att co har initialiserats helt och hållet. I annat fall anropas återanrop innan co förstörs, så att co tidigare tillstånd kan inspekteras.Om event är
PY_CODE_EVENT_DESTROY
kommer en referens i återuppringningen till det kodobjekt som ska förstöras att återuppliva det och förhindra att det frigörs vid den här tidpunkten. När det återupplivade objektet förstörs senare kommer alla watchers callbacks som är aktiva vid den tidpunkten att anropas igen.Användare av detta API bör inte förlita sig på interna implementeringsdetaljer för körtiden. Sådana detaljer kan inkludera, men är inte begränsade till, den exakta ordningen och tidpunkten för skapande och förstörelse av kodobjekt. Även om ändringar i dessa detaljer kan resultera i skillnader som kan observeras av observatörer (inklusive om en återuppringning anropas eller inte), ändrar det inte semantiken i den Python-kod som exekveras.
Om callbacken anger ett undantag måste den returnera
-1
; detta undantag kommer att skrivas ut som ett undantag som inte kan bedömas medPyErr_WriteUnraisable()
. Annars bör det returnera0
.Det kan redan finnas ett väntande undantag inställt vid ingången till återuppringningen. I detta fall bör återuppringningen returnera
0
med samma undantag fortfarande inställt. Detta innebär att återuppringningen inte får anropa något annat API som kan ställa in ett undantag om det inte sparar och rensar undantagstillståndet först och återställer det innan det returneras.Tillagd i version 3.12.
Kod Objekt Flaggor¶
Kodobjekt innehåller ett bitfält med flaggor, som kan hämtas som Python-attributet co_flags
(till exempel med PyObject_GetAttrString()
) och ställas in med ett flags-argument till PyUnstable_Code_New()
och liknande funktioner.
Flaggor vars namn börjar med CO_FUTURE_
motsvarar funktioner som normalt kan väljas med future statements. Dessa flaggor kan användas i PyCompilerFlags.cf_flags
. Observera att många CO_FUTURE_
-flaggor är obligatoriska i nuvarande versioner av Python, och att ange dem har ingen effekt.
Följande flaggor finns tillgängliga. För deras betydelse, se den länkade dokumentationen för deras Python-ekvivalenter.
Flagga |
Betydelse |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ingen effekt ( |
|
ingen effekt ( |
|
ingen effekt ( |
|
ingen effekt ( |
|
ingen effekt ( |
|
ingen effekt ( |
|
Extra information¶
För att stödja lågnivåtillägg till ramutvärdering, t.ex. externa just-in-time-kompilatorer, är det möjligt att bifoga godtyckliga extra data till kodobjekt.
Dessa funktioner är en del av den instabila C API-nivån: denna funktionalitet är en CPython-implementeringsdetalj, och API kan ändras utan varningar om avskrivning.
-
Py_ssize_t PyUnstable_Eval_RequestCodeExtraIndex(freefunc free)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Returnerar ett nytt opakt indexvärde som används för att lägga till data i kodobjekt.
Du anropar vanligtvis den här funktionen en gång (per tolk) och använder resultatet med
PyCode_GetExtra
ochPyCode_SetExtra
för att manipulera data på enskilda kodobjekt.Om free inte är
NULL
: när ett kodobjekt avallokeras kommer free att anropas på data som inte ärNULL
och som lagras under det nya indexet. AnvändPy_DecRef()
när du lagrarPyObject
.Tillagd i version 3.6: som
_PyEval_RequestCodeExtraIndex
Ändrad i version 3.12: Bytt namn till
PyUnstable_Eval_RequestCodeExtraIndex
. Det gamla privata namnet är föråldrat, men kommer att vara tillgängligt tills API ändras.
-
int PyUnstable_Code_GetExtra(PyObject *code, Py_ssize_t index, void **extra)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Ställ in extra till de extra data som lagras under det angivna indexet. Returnera 0 vid framgång. Ställ in ett undantag och returnera -1 vid misslyckande.
Om inga data har angetts under indexet, anges extra till
NULL
och returneras 0 utan att något undantag anges.Tillagd i version 3.6: som
_PyCode_GetExtra
Ändrad i version 3.12: Bytt namn till
PyUnstable_Code_GetExtra
. Det gamla privata namnet är föråldrat, men kommer att vara tillgängligt tills API:et ändras.
-
int PyUnstable_Code_SetExtra(PyObject *code, Py_ssize_t index, void *extra)¶
- Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.
Ställ in de extra data som lagras under det angivna indexet till extra. Returnera 0 vid framgång. Ställ in ett undantag och returnera -1 vid misslyckande.
Tillagd i version 3.6: som
_PyCode_SetExtra
Ändrad i version 3.12: Bytt namn till
PyUnstable_Code_SetExtra
. Det gamla privata namnet är föråldrat, men kommer att vara tillgängligt tills API ändras.