dis — Disassembler für Python-Bytecode¶
Quellcode: Lib/dis.py
Das Modul dis unterstützt die Analyse von CPython Bytecode durch dessen Disassemblierung. Der CPython-Bytecode, den dieses Modul als Eingabe nimmt, ist in der Datei Include/opcode.h definiert und wird vom Compiler und Interpreter verwendet.
CPython-Implementierungsdetail: Bytecode ist ein Implementierungsdetail des CPython-Interpreters. Es gibt keine Garantien dafür, dass Bytecode zwischen Python-Versionen nicht hinzugefügt, entfernt oder geändert wird. Die Verwendung dieses Moduls sollte nicht als funktionierend über Python-VMs oder Python-Releases hinweg betrachtet werden.
Geändert in Version 3.6: Verwendet 2 Bytes für jede Anweisung. Zuvor variierte die Anzahl der Bytes je nach Anweisung.
Geändert in Version 3.10: Das Argument von Sprung-, Ausnahmebehandlungs- und Schleifenanweisungen ist nun der Anweisungsoffset und nicht mehr der Byte-Offset.
Geändert in Version 3.11: Einige Anweisungen werden von einem oder mehreren Inline-Cache-Einträgen begleitet, die in Form von CACHE-Anweisungen vorliegen. Diese Anweisungen sind standardmäßig ausgeblendet, können aber durch Übergabe von show_caches=True an ein beliebiges dis-Dienstprogramm angezeigt werden. Darüber hinaus passt der Interpreter den Bytecode nun an, um ihn für verschiedene Laufzeitbedingungen zu spezialisieren. Der adaptive Bytecode kann durch Übergabe von adaptive=True angezeigt werden.
Geändert in Version 3.12: Das Argument eines Sprungs ist der Offset der Zielanweisung relativ zur Anweisung, die unmittelbar nach den CACHE-Einträgen der Sprunganweisung folgt.
Als Konsequenz ist das Vorhandensein der CACHE-Anweisungen für Vorwärtssprünge transparent, muss aber bei der Überlegung von Rückwärtssprüngen berücksichtigt werden.
Geändert in Version 3.13: Die Ausgabe zeigt logische Labels anstelle von Anweisungsoffsets für Sprungziele und Ausnahmebehandler. Die Kommandozeilenoption -O und das Argument show_offsets wurden hinzugefügt.
Beispiel: Gegeben sei die Funktion myfunc()
def myfunc(alist):
return len(alist)
Der folgende Befehl kann verwendet werden, um die Disassemblierung von myfunc() anzuzeigen
>>> dis.dis(myfunc)
2 RESUME 0
3 LOAD_GLOBAL 1 (len + NULL)
LOAD_FAST_BORROW 0 (alist)
CALL 1
RETURN_VALUE
(Die „2“ ist eine Zeilennummer).
Kommandozeilenschnittstelle¶
Das Modul dis kann als Skript von der Kommandozeile aufgerufen werden
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
Die folgenden Optionen werden akzeptiert:
- -h, --help¶
Zeigt die Nutzung und beendet das Programm.
- -C, --show-caches¶
Zeigt Inline-Caches an.
Hinzugefügt in Version 3.13.
- -O, --show-offsets¶
Zeigt Offsets von Anweisungen an.
Hinzugefügt in Version 3.13.
- -P, --show-positions¶
Zeigt Positionen von Anweisungen im Quellcode an.
Hinzugefügt in Version 3.14.
- -S, --specialized¶
Zeigt spezialisierten Bytecode an.
Hinzugefügt in Version 3.14.
Wenn infile angegeben ist, wird dessen disassemblierter Code nach stdout geschrieben. Andernfalls wird die Disassemblierung für kompilierten Quellcode durchgeführt, der von stdin empfangen wird.
Bytecode-Analyse¶
Hinzugefügt in Version 3.4.
Die API zur Bytecode-Analyse ermöglicht es, Codeabschnitte von Python in ein Bytecode-Objekt zu verpacken, das einfachen Zugriff auf Details des kompilierten Codes bietet.
- class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
Analysiert den Bytecode, der einer Funktion, einem Generator, einem asynchronen Generator, einer Koroutine, einer Methode, einer Quellcode-Zeichenkette oder einem Codeobjekt (wie es von
compile()zurückgegeben wird) entspricht.Dies ist ein praktischer Wrapper um viele der unten aufgeführten Funktionen, insbesondere
get_instructions(), da das Iterieren über eineBytecode-Instanz die Bytecode-Operationen alsInstruction-Instanzen liefert.Wenn first_line nicht
Noneist, gibt es die Zeilennummer an, die für die erste Quellcodezeile im disassemblierten Code gemeldet werden soll. Andernfalls werden die Quellcodezeileninformationen (falls vorhanden) direkt aus dem disassemblierten Codeobjekt übernommen.Wenn current_offset nicht
Noneist, bezieht es sich auf einen Anweisungsoffset im disassemblierten Code. Wenn dies gesetzt ist, zeigtdis()eine Markierung für die „aktuelle Anweisung“ gegen den angegebenen Opcode an.Wenn show_caches
Trueist, zeigtdis()Inline-Cache-Einträge an, die vom Interpreter zum Spezialisieren des Bytecodes verwendet werden.Wenn adaptive
Trueist, zeigtdis()spezialisierten Bytecode an, der sich vom ursprünglichen Bytecode unterscheiden kann.Wenn show_offsets
Trueist, enthältdis()Anweisungsoffsets in der Ausgabe.Wenn show_positions
Trueist, enthältdis()Quellcode-Positionen von Anweisungen in der Ausgabe.- classmethod from_traceback(tb, *, show_caches=False)¶
Konstruiert eine
Bytecode-Instanz aus dem gegebenen Traceback und setzt current_offset auf die Anweisung, die für die Ausnahme verantwortlich ist.
- codeobj¶
Das kompilierte Codeobjekt.
- first_line¶
Die erste Quellcodezeile des Codeobjekts (falls vorhanden).
- dis()¶
Gibt eine formatierte Ansicht der Bytecode-Operationen zurück (dieselbe wie die von
dis.dis()gedruckte Ansicht, aber als mehrzeilige Zeichenkette zurückgegeben).
- info()¶
Gibt eine formatierte mehrzeilige Zeichenkette mit detaillierten Informationen über das Codeobjekt zurück, ähnlich wie
code_info().
Geändert in Version 3.7: Kann nun Koroutinen- und asynchrone Generatorobjekte verarbeiten.
Geändert in Version 3.11: Hinzugefügt wurden die Parameter show_caches und adaptive.
Geändert in Version 3.13: Hinzugefügt wurde der Parameter show_offsets.
Geändert in Version 3.14: Hinzugefügt wurde der Parameter show_positions.
Beispiel
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE
Analysefunktionen¶
Das Modul dis definiert auch die folgenden Analysefunktionen, die die Eingabe direkt in die gewünschte Ausgabe umwandeln. Sie können nützlich sein, wenn nur eine einzige Operation durchgeführt wird, so dass das Zwischenanalyseobjekt nicht nützlich ist.
- dis.code_info(x)¶
Gibt eine formatierte mehrzeilige Zeichenkette mit detaillierten Informationen über das Codeobjekt für die übergebene Funktion, den Generator, den asynchronen Generator, die Koroutine, die Methode, die Quellcode-Zeichenkette oder das Codeobjekt zurück.
Beachten Sie, dass der genaue Inhalt von Code-Info-Zeichenketten stark implementierungsabhängig ist und sich beliebig zwischen Python-VMs oder Python-Releases ändern kann.
Hinzugefügt in Version 3.2.
Geändert in Version 3.7: Kann nun Koroutinen- und asynchrone Generatorobjekte verarbeiten.
- dis.show_code(x, *, file=None)¶
Gibt detaillierte Informationen zum Codeobjekt für die übergebene Funktion, Methode, Quellcode-Zeichenkette oder das Codeobjekt nach file (oder
sys.stdout, wenn file nicht angegeben ist) aus.Dies ist eine praktische Abkürzung für
print(code_info(x), file=file), die für die interaktive Erkundung an der Interpreter-Eingabeaufforderung gedacht ist.Hinzugefügt in Version 3.2.
Geändert in Version 3.4: Der Parameter file wurde hinzugefügt.
- dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
Disassembliert das Objekt x. x kann ein Modul, eine Klasse, eine Methode, eine Funktion, ein Generator, ein asynchroner Generator, eine Koroutine, ein Codeobjekt, eine Quellcode-Zeichenkette oder eine Byte-Sequenz von rohem Bytecode sein. Für ein Modul disassembliert es alle Funktionen. Für eine Klasse disassembliert es alle Methoden (einschließlich Klassen- und statischer Methoden). Für ein Codeobjekt oder eine Sequenz von rohem Bytecode druckt es eine Zeile pro Bytecode-Anweisung. Es disassembliert auch verschachtelte Codeobjekte rekursiv. Dazu können Generator-Ausdrücke, verschachtelte Funktionen, die Körper von verschachtelten Klassen und die Codeobjekte, die für Annotationsbereiche verwendet werden, gehören. Zeichenketten werden vor der Disassemblierung mit der integrierten Funktion
compile()in Codeobjekte kompiliert. Wenn kein Objekt bereitgestellt wird, disassembliert diese Funktion den letzten Traceback.Die Disassemblierung wird als Text in das bereitgestellte Argument file geschrieben, wenn es vorhanden ist, und andernfalls nach
sys.stdout.Die maximale Rekursionstiefe wird durch depth begrenzt, es sei denn, sie ist
None.depth=0bedeutet keine Rekursion.Wenn show_caches
Trueist, zeigt diese Funktion Inline-Cache-Einträge an, die vom Interpreter zum Spezialisieren des Bytecodes verwendet werden.Wenn adaptive
Trueist, zeigt diese Funktion spezialisierten Bytecode an, der sich vom ursprünglichen Bytecode unterscheiden kann.Geändert in Version 3.4: Der Parameter file wurde hinzugefügt.
Geändert in Version 3.7: Rekursive Disassemblierung wurde implementiert und der Parameter depth hinzugefügt.
Geändert in Version 3.7: Kann nun Koroutinen- und asynchrone Generatorobjekte verarbeiten.
Geändert in Version 3.11: Hinzugefügt wurden die Parameter show_caches und adaptive.
Geändert in Version 3.13: Hinzugefügt wurde der Parameter show_offsets.
Geändert in Version 3.14: Hinzugefügt wurde der Parameter show_positions.
- dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False)¶
Disassembliert die Funktion auf dem obersten Stapel eines Tracebacks und verwendet den letzten Traceback, wenn keiner übergeben wurde. Die Anweisung, die die Ausnahme verursacht hat, wird angezeigt.
Die Disassemblierung wird als Text in das bereitgestellte Argument file geschrieben, wenn es vorhanden ist, und andernfalls nach
sys.stdout.Geändert in Version 3.4: Der Parameter file wurde hinzugefügt.
Geändert in Version 3.11: Hinzugefügt wurden die Parameter show_caches und adaptive.
Geändert in Version 3.13: Hinzugefügt wurde der Parameter show_offsets.
Geändert in Version 3.14: Hinzugefügt wurde der Parameter show_positions.
- dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
- dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
Disassembliert ein Codeobjekt und zeigt die letzte Anweisung an, wenn lasti angegeben wurde. Die Ausgabe ist in die folgenden Spalten unterteilt:
die Quellcode-Position der Anweisung. Die vollständige Positionsinformation wird angezeigt, wenn show_positions auf true gesetzt ist. Andernfalls (Standard) wird nur die Zeilennummer angezeigt.
die aktuelle Anweisung, angezeigt durch
-->,eine bezeichnete Anweisung, angezeigt durch
>>,die Adresse der Anweisung,
der Opcode-Name,
die Operationenparameter und
die Interpretation der Parameter in Klammern.
Die Parameterinterpretation erkennt lokale und globale Variablennamen, konstante Werte, Sprungziele und Vergleichsoperatoren.
Die Disassemblierung wird als Text in das bereitgestellte Argument file geschrieben, wenn es vorhanden ist, und andernfalls nach
sys.stdout.Geändert in Version 3.4: Der Parameter file wurde hinzugefügt.
Geändert in Version 3.11: Hinzugefügt wurden die Parameter show_caches und adaptive.
Geändert in Version 3.13: Hinzugefügt wurde der Parameter show_offsets.
Geändert in Version 3.14: Hinzugefügt wurde der Parameter show_positions.
- dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)¶
Gibt einen Iterator über die Anweisungen in der übergebenen Funktion, Methode, Quellcode-Zeichenkette oder dem Codeobjekt zurück.
Der Iterator generiert eine Serie von
Instructionbenannten Tupeln, die die Details jeder Operation im übergebenen Code angeben.Wenn first_line nicht
Noneist, gibt es die Zeilennummer an, die für die erste Quellcodezeile im disassemblierten Code gemeldet werden soll. Andernfalls werden die Quellcodezeileninformationen (falls vorhanden) direkt aus dem disassemblierten Codeobjekt übernommen.Der Parameter adaptive funktioniert wie in
dis().Hinzugefügt in Version 3.4.
Geändert in Version 3.11: Hinzugefügt wurden die Parameter show_caches und adaptive.
Geändert in Version 3.13: Der Parameter show_caches ist veraltet und hat keine Wirkung mehr. Der Iterator generiert die
Instruction-Instanzen mit dem Feld cache_info, das (unabhängig vom Wert von show_caches) gefüllt ist, und generiert keine separaten Elemente mehr für die Cache-Einträge.
- dis.findlinestarts(code)¶
Diese Generatorfunktion verwendet die Methode
co_lines()des Codeobjekts code, um die Offsets zu finden, die Zeilenanfänge im Quellcode sind. Sie werden als(offset, lineno)Paare generiert.Geändert in Version 3.6: Zeilennummern können abnehmend sein. Zuvor waren sie immer steigend.
Geändert in Version 3.10: Die Methode PEP 626
co_lines()wird anstelle der Attributeco_firstlinenoundco_lnotabdes Codeobjekts verwendet.Geändert in Version 3.13: Zeilennummern können
Nonesein für Bytecode, der keinen Quellzeilen zugeordnet ist.
- dis.findlabels(code)¶
Erkennt alle Offsets in der rohen kompilierten Bytecode-Zeichenkette code, die Sprungziele sind, und gibt eine Liste dieser Offsets zurück.
- dis.stack_effect(opcode, oparg=None, *, jump=None)¶
Berechnet den Stack-Effekt von opcode mit dem Argument oparg.
Wenn der Code ein Sprungziel hat und jump
Trueist, gibtstack_effect()den Stack-Effekt des Springens zurück. Wenn jumpFalseist, gibt es den Stack-Effekt des Nicht-Springens zurück. Und wenn jumpNone(Standard) ist, gibt es den maximalen Stack-Effekt beider Fälle zurück.Hinzugefügt in Version 3.4.
Geändert in Version 3.8: Hinzugefügt wurde der Parameter jump.
Geändert in Version 3.13: Wenn
opargweggelassen wird (oderNone), wird der Stack-Effekt nun füroparg=0zurückgegeben. Zuvor war dies ein Fehler für Opcodes, die ihr Arg verwenden. Es ist auch kein Fehler mehr, einen ganzzahligenopargzu übergeben, wenn deropcodeihn nicht verwendet; deropargwird in diesem Fall ignoriert.
Python Bytecode Anweisungen¶
Die Funktion get_instructions() und die Klasse Bytecode liefern Details zu Bytecode-Anweisungen als Instanzen von Instruction.
- class dis.Instruction¶
Details zu einer Bytecode-Operation
- opcode¶
numerischer Code für die Operation, entsprechend den unten aufgeführten Opcode-Werten und den Bytecode-Werten in den Opcode-Sammlungen.
- opname¶
menschenlesbarer Name für die Operation
- baseopcode¶
numerischer Code für die Basisoperation, wenn die Operation spezialisiert ist; andernfalls gleich
opcode
- baseopname¶
menschenlesbarer Name für die Basisoperation, wenn die Operation spezialisiert ist; andernfalls gleich
opname
- arg¶
numerisches Argument für die Operation (falls vorhanden), andernfalls
None
- argval¶
aufgelöster Arg-Wert (falls vorhanden), andernfalls
None
- argrepr¶
menschenlesbare Beschreibung des Operationsarguments (falls vorhanden), andernfalls ein leerer String.
- offset¶
Startindex der Operation innerhalb der Bytecode-Sequenz
- start_offset¶
Startindex der Operation innerhalb der Bytecode-Sequenz, einschließlich nachfolgender
EXTENDED_ARGOperationen, falls vorhanden; andernfalls gleichoffset
- cache_offset¶
Startindex der Cache-Einträge, die der Operation folgen
- end_offset¶
Endindex der Cache-Einträge, die der Operation folgen
- starts_line¶
True, wenn dieser Opcode eine Quellcodezeile beginnt, andernfallsFalse
- line_number¶
Quellcodezeilennummer, die diesem Opcode zugeordnet ist (falls vorhanden), andernfalls
None
- is_jump_target¶
True, wenn anderer Code hierhin springt, andernfallsFalse
- jump_target¶
Bytecode-Index des Sprungziels, wenn dies eine Sprungoperation ist, andernfalls
None
- positions¶
Objekt vom Typ
dis.Positions, das die Start- und Endpositionen enthält, die von dieser Anweisung abgedeckt werden.
- cache_info¶
Informationen über die Cache-Einträge dieser Anweisung, als Tripel der Form
(name, size, data), wobeinameundsizedas Cache-Format beschreiben unddataden Inhalt des Caches darstellt.cache_infoistNone, wenn die Anweisung keine Caches hat.
Hinzugefügt in Version 3.4.
Geändert in Version 3.11: Feld
positionswurde hinzugefügt.Geändert in Version 3.13: Feld
starts_linegeändert.Hinzugefügte Felder:
start_offset,cache_offset,end_offset,baseopname,baseopcode,jump_target,oparg,line_numberundcache_info.
- class dis.Positions¶
Falls die Informationen nicht verfügbar sind, können einige Felder
Nonesein.- lineno¶
- end_lineno¶
- col_offset¶
- end_col_offset¶
Hinzugefügt in Version 3.11.
Der Python-Compiler generiert derzeit die folgenden Bytecode-Anweisungen.
Allgemeine Anweisungen
Im Folgenden beziehen wir uns auf den Interpreter-Stack als STACK und beschreiben Operationen darauf, als ob es eine Python-Liste wäre. Das oberste Element des Stacks entspricht STACK[-1] in dieser Sprache.
- NOP¶
Keine Operation. Wird als Platzhalter vom Bytecode-Optimierer verwendet und zur Generierung von Zeilenverfolgungsevents.
- NOT_TAKEN¶
Keine Operation. Wird vom Interpreter verwendet, um
BRANCH_LEFTundBRANCH_RIGHTEvents fürsys.monitoringaufzuzeichnen.Hinzugefügt in Version 3.14.
- POP_ITER¶
Entfernt den Iterator vom obersten Element des Stacks.
Hinzugefügt in Version 3.14.
- POP_TOP¶
Entfernt das oberste Element des Stacks.
STACK.pop()
- END_FOR¶
Entfernt das oberste Element des Stacks. Entspricht
POP_TOP. Wird zur Bereinigung am Ende von Schleifen verwendet, daher der Name.Hinzugefügt in Version 3.12.
- END_SEND¶
Implementiert
del STACK[-2]. Wird zur Bereinigung verwendet, wenn ein Generator beendet wird.Hinzugefügt in Version 3.12.
- COPY(i)¶
Schiebt das i-te Element auf den obersten Platz des Stacks, ohne es von seiner ursprünglichen Position zu entfernen.
assert i > 0 STACK.append(STACK[-i])
Hinzugefügt in Version 3.11.
- SWAP(i)¶
Vertauscht das oberste Element des Stacks mit dem i-ten Element.
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
Hinzugefügt in Version 3.11.
- CACHE¶
Statt eine tatsächliche Anweisung zu sein, wird dieser Opcode verwendet, um zusätzlichen Speicherplatz für den Interpreter zu markieren, damit nützliche Daten direkt im Bytecode selbst zwischengespeichert werden können. Er wird von allen
dis-Dienstprogrammen automatisch ausgeblendet, kann aber mitshow_caches=Trueangezeigt werden.Logischerweise ist dieser Speicherteil der vorhergehenden Anweisung. Viele Opcodes erwarten, dass sie von einer exakten Anzahl von Caches gefolgt werden, und weisen den Interpreter an, diese zur Laufzeit zu überspringen.
Aufgefüllte Caches können wie beliebige Anweisungen aussehen, daher ist bei der Lesung oder Änderung von rohem, adaptivem Bytecode mit beschleunigten Daten große Vorsicht geboten.
Hinzugefügt in Version 3.11.
Unäre Operationen
Unäre Operationen nehmen das oberste Element des Stacks, wenden die Operation an und schieben das Ergebnis zurück auf den Stack.
- UNARY_NEGATIVE¶
Implementiert
STACK[-1] = -STACK[-1].
- UNARY_NOT¶
Implementiert
STACK[-1] = not STACK[-1].Geändert in Version 3.13: Diese Anweisung erfordert nun ein exaktes
bool-Operand.
- UNARY_INVERT¶
Implementiert
STACK[-1] = ~STACK[-1].
- GET_ITER¶
Implementiert
STACK[-1] = iter(STACK[-1]).
- GET_YIELD_FROM_ITER¶
Wenn
STACK[-1]ein Generator-Iterator oder ein Coroutine-Objekt ist, wird es unverändert gelassen. Andernfalls implementiert esSTACK[-1] = iter(STACK[-1]).Hinzugefügt in Version 3.5.
- TO_BOOL¶
Implementiert
STACK[-1] = bool(STACK[-1]).Hinzugefügt in Version 3.13.
Binäre und In-Place-Operationen
Binäre Operationen entfernen die beiden obersten Elemente vom Stack (STACK[-1] und STACK[-2]). Sie führen die Operation durch und legen das Ergebnis zurück auf den Stack.
In-Place-Operationen sind wie binäre Operationen, aber die Operation wird In-Place ausgeführt, wenn STACK[-2] dies unterstützt, und das resultierende STACK[-1] kann (muss aber nicht) das ursprüngliche STACK[-2] sein.
- BINARY_OP(op)¶
Implementiert die binären und In-Place-Operatoren (abhängig vom Wert von op).
rhs = STACK.pop() lhs = STACK.pop() STACK.append(lhs op rhs)
Hinzugefügt in Version 3.11.
Geändert in Version 3.14: Mit oparg :
NB_SUBSCR, implementiert binäre Indizierung (ersetzt OpcodeBINARY_SUBSCR).
- STORE_SUBSCR¶
Implementiert
key = STACK.pop() container = STACK.pop() value = STACK.pop() container[key] = value
- DELETE_SUBSCR¶
Implementiert
key = STACK.pop() container = STACK.pop() del container[key]
- BINARY_SLICE¶
Implementiert
end = STACK.pop() start = STACK.pop() container = STACK.pop() STACK.append(container[start:end])
Hinzugefügt in Version 3.12.
- STORE_SLICE¶
Implementiert
end = STACK.pop() start = STACK.pop() container = STACK.pop() values = STACK.pop() container[start:end] = value
Hinzugefügt in Version 3.12.
Coroutine-Opcodes
- GET_AWAITABLE(where)¶
Implementiert
STACK[-1] = get_awaitable(STACK[-1]), wobeiget_awaitable(o)ozurückgibt, wennoein Coroutine-Objekt oder ein Generator-Objekt mit dem FlagCO_ITERABLE_COROUTINEist, odero.__await__auflöst.Wenn der Operand
whereungleich Null ist, gibt er an, wo die Anweisung auftritt.1: Nach einem Aufruf von__aenter__2: Nach einem Aufruf von__aexit__
Hinzugefügt in Version 3.5.
Geändert in Version 3.11: Früher hatte diese Anweisung keinen Oparg.
- GET_AITER¶
Implementiert
STACK[-1] = STACK[-1].__aiter__().Hinzugefügt in Version 3.5.
Geändert in Version 3.7: Das Zurückgeben von awaitable Objekten von
__aiter__wird nicht mehr unterstützt.
- GET_ANEXT¶
Implementiert
STACK.append(get_awaitable(STACK[-1].__anext__()))auf dem Stack. SieheGET_AWAITABLEfür Details zuget_awaitable.Hinzugefügt in Version 3.5.
- END_ASYNC_FOR¶
Beendet eine
async for-Schleife. Behandelt eine Ausnahme, die beim Abrufen des nächsten Elements ausgelöst wird. Der Stack enthält das asynchrone Iterable inSTACK[-2]und die ausgelöste Ausnahme inSTACK[-1]. Beide werden gepoppt. Wenn die Ausnahme nichtStopAsyncIterationist, wird sie erneut ausgelöst.Hinzugefügt in Version 3.8.
Geändert in Version 3.11: Die Darstellung der Ausnahme auf dem Stack besteht nun aus einem statt drei Elementen.
- CLEANUP_THROW¶
Behandelt eine Ausnahme, die während eines Aufrufs von
throw()oderclose()im aktuellen Frame ausgelöst wird. WennSTACK[-1]eine Instanz vonStopIterationist, werden drei Werte vom Stack gepoppt und derenvalue-Mitglied geschoben. Andernfalls wirdSTACK[-1]erneut ausgelöst.Hinzugefügt in Version 3.12.
Verschiedene Opcodes
- SET_ADD(i)¶
Implementiert
item = STACK.pop() set.add(STACK[-i], item)
Wird zur Implementierung von Set-Comprehensions verwendet.
- LIST_APPEND(i)¶
Implementiert
item = STACK.pop() list.append(STACK[-i], item)
Wird zur Implementierung von List-Comprehensions verwendet.
- MAP_ADD(i)¶
Implementiert
value = STACK.pop() key = STACK.pop() dict.__setitem__(STACK[-i], key, value)
Wird zur Implementierung von Dict-Comprehensions verwendet.
Hinzugefügt in Version 3.1.
Geändert in Version 3.8: Der Kartenwert ist
STACK[-1]und der Karten-Schlüssel istSTACK[-2]. Zuvor waren diese vertauscht.
Für alle Anweisungen SET_ADD, LIST_APPEND und MAP_ADD wird der hinzuzufügende Wert bzw. Schlüssel/Wert-Paar gepoppt, aber das Container-Objekt bleibt auf dem Stack, damit es für weitere Iterationen der Schleife verfügbar ist.
- RETURN_VALUE¶
Gibt mit
STACK[-1]an den Aufrufer der Funktion zurück.
- YIELD_VALUE¶
Gibt
STACK.pop()von einem Generator zurück.Geändert in Version 3.11: Oparg wird auf die Stack-Tiefe gesetzt.
Geändert in Version 3.12: Oparg wird auf die Tiefe des Ausnahmeblocks gesetzt, für ein effizientes Schließen von Generatoren.
Geändert in Version 3.13: Oparg ist
1, wenn diese Anweisung Teil eines yield-from oder await ist, und0andernfalls.
- SETUP_ANNOTATIONS¶
Prüft, ob
__annotations__inlocals()definiert ist; wenn nicht, wird es als leeresdicteingerichtet. Dieser Opcode wird nur ausgegeben, wenn ein Klassen- oder Modulkörper statisch Variablen-Annotationen enthält.Hinzugefügt in Version 3.6.
- POP_EXCEPT¶
Poppt einen Wert vom Stack, der zur Wiederherstellung des Ausnahme-Zustands verwendet wird.
Geändert in Version 3.11: Die Darstellung der Ausnahme auf dem Stack besteht nun aus einem statt drei Elementen.
- RERAISE¶
Löst die aktuell auf dem Stack liegende Ausnahme erneut aus. Wenn oparg ungleich Null ist, wird ein zusätzlicher Wert vom Stack gepoppt, der zum Setzen von
f_lastides aktuellen Frames verwendet wird.Hinzugefügt in Version 3.9.
Geändert in Version 3.11: Die Darstellung der Ausnahme auf dem Stack besteht nun aus einem statt drei Elementen.
- PUSH_EXC_INFO¶
Poppt einen Wert vom Stack. Schiebt die aktuelle Ausnahme auf den obersten Platz des Stacks. Schiebt den ursprünglich gepoppten Wert zurück auf den Stack. Wird in Ausnahmebehandlern verwendet.
Hinzugefügt in Version 3.11.
- CHECK_EXC_MATCH¶
Führt eine Ausnahme-Übereinstimmung für
exceptdurch. Testet, obSTACK[-2]eine Ausnahme ist, die mitSTACK[-1]übereinstimmt. PopptSTACK[-1]und schiebt das boolesche Ergebnis des Tests.Hinzugefügt in Version 3.11.
- CHECK_EG_MATCH¶
Führt eine Ausnahme-Übereinstimmung für
except*durch. Wendetsplit(STACK[-1])auf die Ausnahme-Gruppe an, dieSTACK[-2]repräsentiert.Bei einer Übereinstimmung werden zwei Elemente vom Stack gepoppt und die nicht übereinstimmende Untergruppe (bei vollständiger Übereinstimmung
None) gefolgt von der übereinstimmenden Untergruppe geschoben. Bei keiner Übereinstimmung wird ein Element (der Übereinstimmungstyp) gepoppt undNonegeschoben.Hinzugefügt in Version 3.11.
- WITH_EXCEPT_START¶
Ruft die Funktion an Position 4 des Stacks mit den Argumenten (type, val, tb) auf, die die Ausnahme an der Spitze des Stacks repräsentieren. Wird verwendet, um den Aufruf
context_manager.__exit__(*exc_info())zu implementieren, wenn eine Ausnahme in einerwith-Anweisung aufgetreten ist.Hinzugefügt in Version 3.9.
Geändert in Version 3.11: Die Funktion
__exit__befindet sich an Position 4 des Stacks und nicht an Position 7. Die Darstellung der Ausnahme auf dem Stack besteht nun aus einem statt drei Elementen.
- LOAD_COMMON_CONSTANT¶
Schiebt eine gemeinsame Konstante auf den Stack. Der Interpreter enthält eine fest kodierte Liste von Konstanten, die von dieser Anweisung unterstützt werden. Wird von der
assert-Anweisung verwendet, umAssertionErrorzu laden.Hinzugefügt in Version 3.14.
- LOAD_BUILD_CLASS¶
Schiebt
builtins.__build_class__()auf den Stack. Es wird später aufgerufen, um eine Klasse zu konstruieren.
- GET_LEN¶
Führt
STACK.append(len(STACK[-1]))aus. Wird inmatch-Anweisungen verwendet, bei denen ein Vergleich mit der Struktur eines Musters erforderlich ist.Hinzugefügt in Version 3.10.
- MATCH_MAPPING¶
Wenn
STACK[-1]eine Instanz voncollections.abc.Mappingist (oder, technischer ausgedrückt: wenn sie dasPy_TPFLAGS_MAPPINGFlag in ihrentp_flagsgesetzt hat), wirdTrueauf den Stack gelegt. Andernfalls wirdFalseauf den Stack gelegt.Hinzugefügt in Version 3.10.
- MATCH_SEQUENCE¶
Wenn
STACK[-1]eine Instanz voncollections.abc.Sequenceist und keine Instanz vonstr/bytes/bytearrayist (oder, technischer ausgedrückt: wenn sie dasPy_TPFLAGS_SEQUENCEFlag in ihrentp_flagsgesetzt hat), wirdTrueauf den Stack gelegt. Andernfalls wirdFalseauf den Stack gelegt.Hinzugefügt in Version 3.10.
- MATCH_KEYS¶
STACK[-1]ist ein Tupel von Mapping-Schlüsseln, undSTACK[-2]ist das Trefferobjekt. WennSTACK[-2]alle Schlüssel inSTACK[-1]enthält, wird ein Tupel mit den entsprechenden Werten auf den Stack gelegt. Andernfalls wirdNoneauf den Stack gelegt.Hinzugefügt in Version 3.10.
Geändert in Version 3.11: Zuvor hat diese Anweisung auch einen booleschen Wert gepusht, der den Erfolg (
True) oder Misserfolg (False) anzeigte.
- STORE_NAME(namei)¶
Implementiert
name = STACK.pop(). *namei* ist der Index von *name* im Attributco_namesdes Code-Objekts. Der Compiler versucht,STORE_FASToderSTORE_GLOBALzu verwenden, wenn möglich.
- DELETE_NAME(namei)¶
Implementiert
del name, wobei *namei* der Index in das Attributco_namesdes Code-Objekts ist.
- UNPACK_SEQUENCE(count)¶
Entpackt
STACK[-1]in *count* einzelne Werte, die von rechts nach links auf den Stack gelegt werden. Es müssen genau *count* Werte vorhanden sein.assert(len(STACK[-1]) == count) STACK.extend(STACK.pop()[:-count-1:-1])
- UNPACK_EX(counts)¶
Implementiert Zuweisungen mit einem Sternchen-Ziel: Entpackt ein Iterable in
STACK[-1]in einzelne Werte, wobei die Gesamtzahl der Werte kleiner sein kann als die Anzahl der Elemente im Iterable: Einer der neuen Werte ist eine Liste aller übrig gebliebenen Elemente.Die Anzahl der Werte vor und nach dem Listenwert ist auf 255 begrenzt.
Die Anzahl der Werte vor der Liste ist im Argument des Opcodes kodiert. Die Anzahl der Werte nach der Liste, falls vorhanden, wird mit einem
EXTENDED_ARGkodiert. Folglich kann das Argument als Zweibyte-Wert betrachtet werden, wobei das niederwertige Byte von *counts* die Anzahl der Werte vor der Liste und das höherwertige Byte die Anzahl der Werte danach ist.Die extrahierten Werte werden von rechts nach links auf den Stack gelegt, d.h.
a, *b, c = dwird nach der Ausführung alsSTACK.extend((a, b, c))gespeichert.
- STORE_ATTR(namei)¶
Implementiert
obj = STACK.pop() value = STACK.pop() obj.name = value
wobei *namei* der Index des Namens in
co_namesdes Code-Objekts ist.
- DELETE_ATTR(namei)¶
Implementiert
obj = STACK.pop() del obj.name
wobei *namei* der Index des Namens in
co_namesdes Code-Objekts ist.
- STORE_GLOBAL(namei)¶
Funktioniert wie
STORE_NAME, speichert aber den Namen als global.
- DELETE_GLOBAL(namei)¶
Funktioniert wie
DELETE_NAME, löscht aber einen globalen Namen.
- LOAD_CONST(consti)¶
Legt
co_consts[consti]auf den Stack.
- LOAD_SMALL_INT(i)¶
Legt die Ganzzahl
iauf den Stack.imuss im Bereichrange(256)liegen.Hinzugefügt in Version 3.14.
- LOAD_NAME(namei)¶
Legt den Wert, der mit
co_names[namei]assoziiert ist, auf den Stack. Der Name wird zuerst in den Locals, dann in den Globals und dann in den Builtins gesucht.
- LOAD_LOCALS¶
Legt eine Referenz auf das Locals-Dictionary auf den Stack. Dies wird verwendet, um Namensraum-Dictionaries für
LOAD_FROM_DICT_OR_DEREFundLOAD_FROM_DICT_OR_GLOBALSvorzubereiten.Hinzugefügt in Version 3.12.
- LOAD_FROM_DICT_OR_GLOBALS(i)¶
Entnimmt eine Abbildung vom Stack und sucht den Wert für
co_names[namei]. Wenn der Name dort nicht gefunden wird, wird er in den Globals und dann in den Builtins gesucht, ähnlich wie beiLOAD_GLOBAL. Dies wird zum Laden von globalen Variablen in Annotation-Scopes innerhalb von Klassenkörpern verwendet.Hinzugefügt in Version 3.12.
- BUILD_TEMPLATE¶
Konstruiert eine neue
Template-Instanz aus einem Tupel von Strings und einem Tupel von Interpolationen und legt das resultierende Objekt auf den Stack.interpolations = STACK.pop() strings = STACK.pop() STACK.append(_build_template(strings, interpolations))
Hinzugefügt in Version 3.14.
- BUILD_INTERPOLATION(format)¶
Konstruiert eine neue
Interpolation-Instanz aus einem Wert und seinem Quell-Ausdruck und legt das resultierende Objekt auf den Stack.Wenn keine Konvertierung oder Formatierungsspezifikation vorhanden ist, wird
formatauf2gesetzt.Wenn das niedrigste Bit von
formatgesetzt ist, zeigt dies an, dass die Interpolation eine Formatierungsspezifikation enthält.Wenn
format >> 2ungleich Null ist, bedeutet dies, dass die Interpolation eine Konvertierung enthält. Der Wert vonformat >> 2ist der Konvertierungstyp (0für keine Konvertierung,1für!s,2für!rund3für!a).conversion = format >> 2 if format & 1: format_spec = STACK.pop() else: format_spec = None expression = STACK.pop() value = STACK.pop() STACK.append(_build_interpolation(value, expression, conversion, format_spec))
Hinzugefügt in Version 3.14.
- BUILD_TUPLE(count)¶
Erstellt ein Tupel, das *count* Elemente vom Stack verbraucht, und legt das resultierende Tupel auf den Stack.
if count == 0: value = () else: value = tuple(STACK[-count:]) STACK = STACK[:-count] STACK.append(value)
- BUILD_LIST(count)¶
Funktioniert wie
BUILD_TUPLE, erstellt aber eine Liste.
- BUILD_SET(count)¶
Funktioniert wie
BUILD_TUPLE, erstellt aber ein Set.
- BUILD_MAP(count)¶
Legt ein neues Dictionary-Objekt auf den Stack. Holt
2 * countElemente vom Stack, so dass das Dictionary *count* Einträge enthält:{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.Geändert in Version 3.5: Das Dictionary wird aus Stack-Elementen erstellt, anstatt ein leeres, vordefiniertes Dictionary zu erstellen.
- BUILD_STRING(count)¶
Verkettet *count* Strings vom Stack und legt den resultierenden String auf den Stack.
Hinzugefügt in Version 3.6.
- LIST_EXTEND(i)¶
Implementiert
seq = STACK.pop() list.extend(STACK[-i], seq)
Wird zum Erstellen von Listen verwendet.
Hinzugefügt in Version 3.9.
- SET_UPDATE(i)¶
Implementiert
seq = STACK.pop() set.update(STACK[-i], seq)
Wird zum Erstellen von Sets verwendet.
Hinzugefügt in Version 3.9.
- DICT_UPDATE(i)¶
Implementiert
map = STACK.pop() dict.update(STACK[-i], map)
Wird zum Erstellen von Dictionaries verwendet.
Hinzugefügt in Version 3.9.
- DICT_MERGE(i)¶
Ähnlich wie
DICT_UPDATE, löst aber eine Ausnahme für doppelte Schlüssel aus.Hinzugefügt in Version 3.9.
- LOAD_ATTR(namei)¶
Wenn das niedrigste Bit von
nameinicht gesetzt ist, ersetzt diesSTACK[-1]durchgetattr(STACK[-1], co_names[namei>>1]).Wenn das niedrigste Bit von
nameigesetzt ist, wird versucht, eine Methode namensco_names[namei>>1]aus dem ObjektSTACK[-1]zu laden.STACK[-1]wird vom Stack geholt. Dieser Bytecode unterscheidet zwei Fälle: WennSTACK[-1]eine Methode mit dem korrekten Namen hat, legt der Bytecode die ungebundene Methode undSTACK[-1]auf den Stack.STACK[-1]wird als erstes Argument (self) vonCALLoderCALL_KWbeim Aufruf der ungebundenen Methode verwendet. Andernfalls werdenNULLund das von der Attributsuche zurückgegebene Objekt auf den Stack gelegt.Geändert in Version 3.12: Wenn das niedrigste Bit von
nameigesetzt ist, wird vor dem Attribut bzw. der ungebundenen Methode einNULLoderselfauf den Stack gelegt.
- LOAD_SUPER_ATTR(namei)¶
Dieser Opcode implementiert
super(), sowohl in seiner Null-Argument- als auch in seiner Zwei-Argument-Form (z.B.super().method(),super().attrundsuper(cls, self).method(),super(cls, self).attr).Er holt drei Werte vom Stack (von oben nach unten)
self: das erste Argument der aktuellen Methodecls: die Klasse, innerhalb derer die aktuelle Methode definiert wurdedas globale
super
Bezüglich seines Arguments verhält er sich ähnlich wie
LOAD_ATTR, außer dassnameium 2 Bits nach links verschoben wird statt um 1.Das niedrigste Bit von
nameisignalisiert den Versuch, eine Methode zu laden, wie beiLOAD_ATTR, was dazu führt, dassNULLund die geladene Methode gepusht werden. Wenn es nicht gesetzt ist, wird ein einzelner Wert auf den Stack gelegt.Das zweitniedrigste Bit von
nameibedeutet, wenn es gesetzt ist, dass dies ein Zwei-Argument-Aufruf vonsuper()war (nicht gesetzt bedeutet Null-Argument).Hinzugefügt in Version 3.12.
- COMPARE_OP(opname)¶
Führt eine boolesche Operation durch. Der Operationsname kann in
cmp_op[opname >> 5]gefunden werden. Wenn das fünftniedrigste Bit vonopnamegesetzt ist (opname & 16), sollte das Ergebnis zuboolkoordiniert werden.Geändert in Version 3.13: Das fünftniedrigste Bit des oparg zeigt nun eine erzwungene Konvertierung zu
boolan.
- IS_OP(invert)¶
Führt den
is-Vergleich durch, oderis not, wenninvert1 ist.Hinzugefügt in Version 3.9.
- CONTAINS_OP(invert)¶
Führt den
in-Vergleich durch, odernot in, wenninvert1 ist.Hinzugefügt in Version 3.9.
- IMPORT_NAME(namei)¶
Importiert das Modul
co_names[namei].STACK[-1]undSTACK[-2]werden vom Stack geholt und stellen die Argumente *fromlist* und *level* von__import__()bereit. Das Modulobjekt wird auf den Stack gelegt. Der aktuelle Namensraum wird nicht beeinflusst: für eine ordnungsgemäße Importanweisung modifiziert eine nachfolgendeSTORE_FAST-Anweisung den Namensraum.
- IMPORT_FROM(namei)¶
Lädt das Attribut
co_names[namei]aus dem Modul, das inSTACK[-1]gefunden wurde. Das resultierende Objekt wird auf den Stack gelegt, um anschließend von einerSTORE_FAST-Anweisung gespeichert zu werden.
- JUMP_FORWARD(delta)¶
Erhöht den Bytecode-Zähler um *delta*.
- JUMP_BACKWARD(delta)¶
Verringert den Bytecode-Zähler um *delta*. Prüft auf Unterbrechungen.
Hinzugefügt in Version 3.11.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
Verringert den Bytecode-Zähler um *delta*. Prüft nicht auf Unterbrechungen.
Hinzugefügt in Version 3.11.
- POP_JUMP_IF_TRUE(delta)¶
Wenn
STACK[-1]wahr ist, wird der Bytecode-Zähler um *delta* erhöht.STACK[-1]wird vom Stack geholt.Geändert in Version 3.11: Der oparg ist nun ein relativer Delta-Wert anstelle eines absoluten Ziels. Dieser Opcode ist eine Pseudo-Anweisung, die im endgültigen Bytecode durch die gerichteten Versionen (vorwärts/rückwärts) ersetzt wird.
Geändert in Version 3.12: Dies ist keine Pseudo-Anweisung mehr.
Geändert in Version 3.13: Diese Anweisung erfordert nun ein exaktes
bool-Operand.
- POP_JUMP_IF_FALSE(delta)¶
Wenn
STACK[-1]falsch ist, wird der Bytecode-Zähler um *delta* erhöht.STACK[-1]wird vom Stack geholt.Geändert in Version 3.11: Der oparg ist nun ein relativer Delta-Wert anstelle eines absoluten Ziels. Dieser Opcode ist eine Pseudo-Anweisung, die im endgültigen Bytecode durch die gerichteten Versionen (vorwärts/rückwärts) ersetzt wird.
Geändert in Version 3.12: Dies ist keine Pseudo-Anweisung mehr.
Geändert in Version 3.13: Diese Anweisung erfordert nun ein exaktes
bool-Operand.
- POP_JUMP_IF_NOT_NONE(delta)¶
Wenn
STACK[-1]nichtNoneist, wird der Bytecode-Zähler um *delta* erhöht.STACK[-1]wird vom Stack geholt.Hinzugefügt in Version 3.11.
Geändert in Version 3.12: Dies ist keine Pseudo-Anweisung mehr.
- POP_JUMP_IF_NONE(delta)¶
Wenn
STACK[-1]Noneist, wird der Bytecode-Zähler um *delta* erhöht.STACK[-1]wird vom Stack geholt.Hinzugefügt in Version 3.11.
Geändert in Version 3.12: Dies ist keine Pseudo-Anweisung mehr.
- FOR_ITER(delta)¶
STACK[-1]ist ein Iterator. Ruft seine__next__()-Methode auf. Wenn dies einen neuen Wert liefert, wird er auf den Stack gelegt (wobei der Iterator darunter bleibt). Wenn der Iterator anzeigt, dass er erschöpft ist, wird der Bytecode-Zähler um *delta* erhöht.Geändert in Version 3.12: Bis 3.11 wurde der Iterator beim Erschöpfen vom Stack geholt.
- LOAD_GLOBAL(namei)¶
Lädt das globale Element mit dem Namen
co_names[namei>>1]auf den Stack.Geändert in Version 3.11: Wenn das niedrigste Bit von
nameigesetzt ist, wird vor der globalen Variable einNULLauf den Stack gelegt.
- LOAD_FAST(var_num)¶
Legt eine Referenz auf die lokale Variable
co_varnames[var_num]auf den Stack.Geändert in Version 3.12: Dieser Opcode wird nun nur in Situationen verwendet, in denen garantiert ist, dass die lokale Variable initialisiert ist. Er kann keine
UnboundLocalErrorauslösen.
- LOAD_FAST_BORROW(var_num)¶
Legt eine geliehene Referenz auf die lokale Variable
co_varnames[var_num]auf den Stack.Hinzugefügt in Version 3.14.
- LOAD_FAST_LOAD_FAST(var_nums)¶
Legt Referenzen auf
co_varnames[var_nums >> 4]undco_varnames[var_nums & 15]auf den Stack.Hinzugefügt in Version 3.13.
- LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)¶
Legt geliehene Referenzen auf
co_varnames[var_nums >> 4]undco_varnames[var_nums & 15]auf den Stack.Hinzugefügt in Version 3.14.
- LOAD_FAST_CHECK(var_num)¶
Pusht eine Referenz auf die lokale Variable
co_varnames[var_num]auf den Stack und löst einenUnboundLocalErroraus, wenn die lokale Variable nicht initialisiert wurde.Hinzugefügt in Version 3.12.
- LOAD_FAST_AND_CLEAR(var_num)¶
Pusht eine Referenz auf die lokale Variable
co_varnames[var_num]auf den Stack (oder pushtNULLauf den Stack, wenn die lokale Variable nicht initialisiert wurde) und setztco_varnames[var_num]aufNULL.Hinzugefügt in Version 3.12.
- STORE_FAST(var_num)¶
Speichert
STACK.pop()in der lokalen Variableco_varnames[var_num].
- STORE_FAST_STORE_FAST(var_nums)¶
Speichert
STACK[-1]inco_varnames[var_nums >> 4]undSTACK[-2]inco_varnames[var_nums & 15].Hinzugefügt in Version 3.13.
- STORE_FAST_LOAD_FAST(var_nums)¶
Speichert
STACK.pop()in der lokalen Variableco_varnames[var_nums >> 4]und pusht eine Referenz auf die lokale Variableco_varnames[var_nums & 15]auf den Stack.Hinzugefügt in Version 3.13.
- DELETE_FAST(var_num)¶
Löscht die lokale Variable
co_varnames[var_num].
- MAKE_CELL(i)¶
Erstellt eine neue Zelle im Slot
i. Wenn dieser Slot nicht leer ist, wird dessen Wert in die neue Zelle gespeichert.Hinzugefügt in Version 3.11.
- LOAD_DEREF(i)¶
Lädt die Zelle im Slot
ides Speichers für "schnelle lokale Variablen". Pusht eine Referenz auf das Objekt, das die Zelle enthält, auf den Stack.Geändert in Version 3.11:
iwird nicht mehr um die Länge vonco_varnamesversetzt.
- LOAD_FROM_DICT_OR_DEREF(i)¶
Entnimmt ein Mapping vom Stack und sucht den Namen, der mit Slot
ides Speichers für "schnelle lokale Variablen" assoziiert ist, in diesem Mapping. Wenn der Name dort nicht gefunden wird, wird er aus der Zelle im Slotigeladen, ähnlich wie beiLOAD_DEREF. Dies wird zum Laden von Closure-Variablen in Klassenkörpern (was zuvorLOAD_CLASSDEREFverwendete) und in Annotation-Scopes innerhalb von Klassenkörpern verwendet.Hinzugefügt in Version 3.12.
- STORE_DEREF(i)¶
Speichert
STACK.pop()in der Zelle im Slotides Speichers für "schnelle lokale Variablen".Geändert in Version 3.11:
iwird nicht mehr um die Länge vonco_varnamesversetzt.
- DELETE_DEREF(i)¶
Leert die Zelle im Slot
ides Speichers für "schnelle lokale Variablen". Wird von derdel-Anweisung verwendet.Hinzugefügt in Version 3.2.
Geändert in Version 3.11:
iwird nicht mehr um die Länge vonco_varnamesversetzt.
- COPY_FREE_VARS(n)¶
Kopiert die
nfreien (Closure-)Variablen aus der Closure in den Frame. Macht speziellen Code auf der Aufruferseite beim Aufrufen von Closures überflüssig.Hinzugefügt in Version 3.11.
- RAISE_VARARGS(argc)¶
Löst eine Ausnahme aus, die eine der 3 Formen der
raise-Anweisung verwendet, abhängig vom Wert von argc0:
raise(vorherige Ausnahme erneut auslösen)1:
raise STACK[-1](Ausnahmeinstanz oder -typ aufSTACK[-1]auslösen)2:
raise STACK[-2] from STACK[-1](Ausnahmeinstanz oder -typ aufSTACK[-2]mit__cause__alsSTACK[-1]auslösen)
- CALL(argc)¶
Ruft ein aufrufbares Objekt mit der von
argcangegebenen Anzahl von Argumenten auf. Auf dem Stack befinden sich (in aufsteigender Reihenfolge)Das aufrufbare Objekt
selfoderNULLDie verbleibenden positionsabhängigen Argumente
argcist die Gesamtzahl der positionsabhängigen Argumente, exklusiveself.CALLentnimmt alle Argumente und das aufrufbare Objekt vom Stack, ruft das aufrufbare Objekt mit diesen Argumenten auf und pusht den Rückgabewert des aufrufbaren Objekts.Hinzugefügt in Version 3.11.
Geändert in Version 3.13: Das aufrufbare Objekt befindet sich nun immer an derselben Position auf dem Stack.
Geändert in Version 3.13: Aufrufe mit benannten Argumenten werden nun von
CALL_KWbehandelt.
- CALL_KW(argc)¶
Ruft ein aufrufbares Objekt mit der von
argcangegebenen Anzahl von Argumenten auf, einschließlich eines oder mehrerer benannter Argumente. Auf dem Stack befinden sich (in aufsteigender Reihenfolge)Das aufrufbare Objekt
selfoderNULLDie verbleibenden positionsabhängigen Argumente
Die benannten Argumente
Ein
Tupelvon Namen für benannte Argumente
argcist die Gesamtzahl der positionsabhängigen und benannten Argumente, exklusiveself. Die Länge des Tupels von Namen für benannte Argumente ist die Anzahl der benannten Argumente.CALL_KWentnimmt alle Argumente, die benannten Namen und das aufrufbare Objekt vom Stack, ruft das aufrufbare Objekt mit diesen Argumenten auf und pusht den Rückgabewert des aufrufbaren Objekts.Hinzugefügt in Version 3.13.
- CALL_FUNCTION_EX(flags)¶
Ruft ein aufrufbares Objekt mit einer variablen Menge von positionsabhängigen und benannten Argumenten auf. Wenn das niedrigste Bit von flags gesetzt ist, enthält die Spitze des Stacks ein Mapping-Objekt mit zusätzlichen benannten Argumenten. Bevor das aufrufbare Objekt aufgerufen wird, werden das Mapping-Objekt und das Iterable-Objekt jeweils "entpackt" und ihre Inhalte als benannte bzw. positionsabhängige Argumente übergeben.
CALL_FUNCTION_EXentnimmt alle Argumente und das aufrufbare Objekt vom Stack, ruft das aufrufbare Objekt mit diesen Argumenten auf und pusht den Rückgabewert des aufrufbaren Objekts.Hinzugefügt in Version 3.6.
- PUSH_NULL¶
Pusht ein
NULLauf den Stack. Wird in der Aufrufsequenz verwendet, um das vonLOAD_METHODfür Nicht-Methodenaufrufe gepushteNULLabzugleichen.Hinzugefügt in Version 3.11.
- MAKE_FUNCTION¶
Pusht ein neues Funktions-Objekt auf den Stack, das aus dem Code-Objekt auf
STACK[-1]aufgebaut ist.Geändert in Version 3.10: Der Flag-Wert
0x04ist ein Tupel von Strings anstelle eines Dictionaries.Geändert in Version 3.11: Der qualifizierte Name auf
STACK[-1]wurde entfernt.Geändert in Version 3.13: Zusätzliche Funktionsattribute auf dem Stack, signalisiert durch Oparg-Flags, wurden entfernt. Sie verwenden nun
SET_FUNCTION_ATTRIBUTE.
- SET_FUNCTION_ATTRIBUTE(flag)¶
Setzt ein Attribut eines Funktions-Objekts. Erwartet die Funktion auf
STACK[-1]und den zu setzenden Attributwert aufSTACK[-2]; verbraucht beide und lässt die Funktion aufSTACK[-1]zurück. Das Flag bestimmt, welches Attribut gesetzt wird.0x01ein Tupel von Standardwerten für positionsabhängige und positionsabhängige/benannte Parameter in positionsabhängiger Reihenfolge0x02ein Dictionary von Standardwerten für nur-benannte Parameter0x04ein Tupel von Strings mit den Annotationen der Parameter0x08ein Tupel, das Zellen für freie Variablen enthält und eine Closure bildet
Hinzugefügt in Version 3.13.
- BUILD_SLICE(argc)¶
Pusht ein Slice-Objekt auf den Stack. argc muss 2 oder 3 sein. Wenn es 2 ist, implementiert es
end = STACK.pop() start = STACK.pop() STACK.append(slice(start, end))
Wenn es 3 ist, implementiert es
step = STACK.pop() end = STACK.pop() start = STACK.pop() STACK.append(slice(start, end, step))
Weitere Informationen finden Sie in der integrierten Funktion
slice().
- EXTENDED_ARG(ext)¶
Präfix für jeden Opcode, dessen Argument zu groß ist, um in das Standard-Byte zu passen. ext enthält ein zusätzliches Byte, das als höhere Bits im Argument fungiert. Für jeden Opcode sind höchstens drei präfixale
EXTENDED_ARGerlaubt, die ein Argument von zwei bis vier Bytes bilden.
- CONVERT_VALUE(oparg)¶
Konvertiert den Wert in einen String, abhängig von
opargvalue = STACK.pop() result = func(value) STACK.append(result)
oparg == 1: ruftstr()auf value aufoparg == 2: ruftrepr()auf value aufoparg == 3: ruftascii()auf value auf
Wird zur Implementierung von formatierten String-Literalen (f-strings) verwendet.
Hinzugefügt in Version 3.13.
- FORMAT_SIMPLE¶
Formatiert den Wert auf der Spitze des Stacks.
value = STACK.pop() result = value.__format__("") STACK.append(result)
Wird zur Implementierung von formatierten String-Literalen (f-strings) verwendet.
Hinzugefügt in Version 3.13.
- FORMAT_WITH_SPEC¶
Formatiert den gegebenen Wert mit der gegebenen Formatierungspezifikation.
spec = STACK.pop() value = STACK.pop() result = value.__format__(spec) STACK.append(result)
Wird zur Implementierung von formatierten String-Literalen (f-strings) verwendet.
Hinzugefügt in Version 3.13.
- MATCH_CLASS(count)¶
STACK[-1]ist ein Tupel von Namen für Schlüsselwortattribute,STACK[-2]ist die Klasse, gegen die abgeglichen wird, undSTACK[-3]ist das Abgleichobjekt. count ist die Anzahl der positionsabhängigen Unter-Muster.Entnimmt
STACK[-1],STACK[-2]undSTACK[-3]. WennSTACK[-3]eine Instanz vonSTACK[-2]ist und die positionsabhängigen und benannten Attribute besitzt, die von count undSTACK[-1]gefordert werden, wird ein Tupel der extrahierten Attribute gepusht. Andernfalls wirdNonegepusht.Hinzugefügt in Version 3.10.
Geändert in Version 3.11: Zuvor hat diese Anweisung auch einen booleschen Wert gepusht, der den Erfolg (
True) oder Misserfolg (False) anzeigte.
- RESUME(context)¶
Ein No-Op. Führt interne Überwachungs-, Debugging- und Optimierungsprüfungen durch.
Der Operand
contextbesteht aus zwei Teilen. Die beiden niedrigsten Bits geben an, woRESUMEauftritt.0Der Beginn einer Funktion, die weder ein Generator, eine Coroutine noch ein asynchroner Generator ist.1Nach einemyield-Ausdruck.2Nach einemyield from-Ausdruck.3Nach einemawait-Ausdruck.
Das nächste Bit ist
1, wennRESUMEauf der Ausnahme-Tiefe1auftritt, und0andernfalls.Hinzugefügt in Version 3.11.
Geändert in Version 3.13: Der Oparg-Wert wurde geändert, um Informationen über die Ausnahme-Tiefe zu enthalten.
- RETURN_GENERATOR¶
Erstellt einen Generator, eine Coroutine oder einen asynchronen Generator aus dem aktuellen Frame. Wird als erster Opcode im Code-Objekt für die oben genannten aufrufbaren Objekte verwendet. Löscht den aktuellen Frame und gibt den neu erstellten Generator zurück.
Hinzugefügt in Version 3.11.
- SEND(delta)¶
Entspricht
STACK[-1] = STACK[-2].send(STACK[-1]). Wird inyield fromundawait-Anweisungen verwendet.Wenn der Aufruf
StopIterationauslöst, wird der oberste Wert vom Stack entnommen, dasvalue-Attribut der Ausnahme gepusht und der Bytecode-Zähler um delta erhöht.Hinzugefügt in Version 3.11.
- HAVE_ARGUMENT¶
Dies ist keine echte Opcode. Sie kennzeichnet die Trennlinie zwischen Opcodes im Bereich [0,255], die ihr Argument nicht verwenden, und denen, die es tun (
< HAVE_ARGUMENTund>= HAVE_ARGUMENT, bzw. umgekehrt).Wenn Ihre Anwendung Pseudobefehle oder spezialisierte Befehle verwendet, verwenden Sie stattdessen die Sammlung
hasarg.Geändert in Version 3.6: Jetzt hat jede Anweisung ein Argument, aber Opcodes
< HAVE_ARGUMENTignorieren es. Zuvor hatten nur Opcodes>= HAVE_ARGUMENTein Argument.Geändert in Version 3.12: Pseudobefehle wurden dem
dis-Modul hinzugefügt, und für sie gilt nicht, dass ein Vergleich mitHAVE_ARGUMENTangibt, ob sie ihr Argument verwenden.Veraltet seit Version 3.13: Verwenden Sie stattdessen
hasarg.
- CALL_INTRINSIC_1¶
Ruft eine interne Funktion mit einem Argument auf. Übergibt
STACK[-1]als Argument und setztSTACK[-1]auf das Ergebnis. Wird zur Implementierung von Funktionalität verwendet, die nicht leistungskritisch ist.Der Operand bestimmt, welche interne Funktion aufgerufen wird.
Operand
Beschreibung
INTRINSIC_1_INVALIDNicht gültig
INTRINSIC_PRINTGibt das Argument auf der Standardausgabe aus. Wird in der REPL verwendet.
INTRINSIC_IMPORT_STARFührt
import *für das benannte Modul aus.INTRINSIC_STOPITERATION_ERRORExtrahiert den Rückgabewert aus einer
StopIteration-Ausnahme.INTRINSIC_ASYNC_GEN_WRAPWickelt einen asynchronen Generatorwert.
INTRINSIC_UNARY_POSITIVEFührt die unäre Operation
+aus.INTRINSIC_LIST_TO_TUPLEKonvertiert eine Liste in ein Tupel.
INTRINSIC_TYPEVARErstellt einen
typing.TypeVar.INTRINSIC_PARAMSPECErstellt einen
typing.ParamSpec.INTRINSIC_TYPEVARTUPLEErstellt einen
typing.TypeVarTuple.INTRINSIC_SUBSCRIPT_GENERICGibt
typing.Genericmit dem Argument subscripted zurück.INTRINSIC_TYPEALIASErstellt einen
typing.TypeAliasType; wird in dertype-Anweisung verwendet. Das Argument ist ein Tupel aus dem Namen des Typ-Alias, den Typ-Parametern und dem Wert.Hinzugefügt in Version 3.12.
- CALL_INTRINSIC_2¶
Ruft eine interne Funktion mit zwei Argumenten auf. Wird zur Implementierung von Funktionalität verwendet, die nicht leistungskritisch ist.
arg2 = STACK.pop() arg1 = STACK.pop() result = intrinsic2(arg1, arg2) STACK.append(result)
Der Operand bestimmt, welche interne Funktion aufgerufen wird.
Operand
Beschreibung
INTRINSIC_2_INVALIDNicht gültig
INTRINSIC_PREP_RERAISE_STARBerechnet die
ExceptionGroup, die aus einemtry-except*ausgelöst werden soll.INTRINSIC_TYPEVAR_WITH_BOUNDErstellt einen
typing.TypeVarmit einer Bindung.INTRINSIC_TYPEVAR_WITH_CONSTRAINTSErstellt einen
typing.TypeVarmit Einschränkungen.INTRINSIC_SET_FUNCTION_TYPE_PARAMSSetzt das Attribut
__type_params__einer Funktion.Hinzugefügt in Version 3.12.
- LOAD_SPECIAL¶
Führt eine spezielle Methodensuche auf
STACK[-1]durch. Wenntype(STACK[-1]).__xxx__eine Methode ist, wirdtype(STACK[-1]).__xxx__; STACK[-1]auf den Stack gelegt. Wenntype(STACK[-1]).__xxx__keine Methode ist, wirdSTACK[-1].__xxx__; NULLauf den Stack gelegt.Hinzugefügt in Version 3.14.
Pseudo-instructions
Diese Opcodes erscheinen nicht im Python-Bytecode. Sie werden vom Compiler verwendet, aber durch echte Opcodes ersetzt oder vor der Bytecode-Generierung entfernt.
- SETUP_FINALLY(target)¶
Richtet einen Ausnahmehandler für den folgenden Codeblock ein. Wenn eine Ausnahme auftritt, wird das Niveau des Wert-Stacks auf seinen aktuellen Zustand wiederhergestellt und die Kontrolle an den Ausnahmehandler bei
targetübertragen.
- SETUP_CLEANUP(target)¶
Ähnlich wie
SETUP_FINALLY, aber im Falle einer Ausnahme wird auch die letzte Anweisung (lasti) auf den Stack gelegt, damitRERAISEsie wiederherstellen kann. Wenn eine Ausnahme auftritt, werden das Niveau des Wert-Stacks und die letzte Anweisung im Frame auf ihren aktuellen Zustand zurückgesetzt und die Kontrolle an den Ausnahmehandler beitargetübertragen.
- SETUP_WITH(target)¶
Ähnlich wie
SETUP_CLEANUP, aber im Falle einer Ausnahme wird ein weiteres Element vom Stack entnommen, bevor die Kontrolle an den Ausnahmehandler beitargetübertragen wird.Diese Variante wird in
withundasync with-Konstrukten verwendet, die den Rückgabewert des__enter__()oder__aenter__()-Aufrufs des Kontextmanagers auf den Stack legen.
- POP_BLOCK¶
Markiert das Ende des Codeblocks, der dem letzten
SETUP_FINALLY,SETUP_CLEANUPoderSETUP_WITHzugeordnet ist.
- LOAD_CONST_IMMORTAL(consti)¶
Funktioniert wie
LOAD_CONST, ist aber effizienter für unsterbliche Objekte.
- JUMP¶
- JUMP_NO_INTERRUPT¶
Ungelenkte relative Sprunganweisungen, die vom Assembler durch ihre gelenkten (vorwärts/rückwärts) Gegenstücke ersetzt werden.
- JUMP_IF_TRUE¶
- JUMP_IF_FALSE¶
Bedingte Sprünge, die den Stack nicht beeinflussen. Ersetzt durch die Sequenz
COPY 1,TO_BOOL,POP_JUMP_IF_TRUE/FALSE.
- LOAD_CLOSURE(i)¶
Pusht eine Referenz auf die Zelle im Slot
ides Speichers für "schnelle lokale Variablen".Beachten Sie, dass
LOAD_CLOSUREim Assembler durchLOAD_FASTersetzt wird.Geändert in Version 3.13: Dieser Opcode ist nun eine Pseudonweisung.
Opcode-Sammlungen¶
Diese Sammlungen werden für die automatische Introspektion von Bytecode-Anweisungen bereitgestellt.
Geändert in Version 3.12: Die Sammlungen enthalten nun auch Pseudobefehle und instrumentierte Befehle. Dies sind Opcodes mit Werten >= MIN_PSEUDO_OPCODE und >= MIN_INSTRUMENTED_OPCODE.
- dis.opname¶
Sequenz von Operationsnamen, indexierbar über den Bytecode.
- dis.opmap¶
Dictionary, das Operationsnamen auf Bytecodes abbildet.
- dis.cmp_op¶
Sequenz aller Vergleichsoperationsnamen.
- dis.hasarg¶
Sequenz von Bytecodes, die ihr Argument verwenden.
Hinzugefügt in Version 3.12.
- dis.hasconst¶
Sequenz von Bytecodes, die auf eine Konstante zugreifen.
- dis.hasfree¶
Sequenz von Bytecodes, die auf eine freie (Closure-)Variable zugreifen. "Frei" bezieht sich in diesem Zusammenhang auf Namen im aktuellen Geltungsbereich, auf die von inneren Geltungsbereichen verwiesen wird, oder auf Namen in äußeren Geltungsbereichen, auf die aus diesem Geltungsbereich verwiesen wird. Er schließt keine Verweise auf globale oder eingebaute Geltungsbereiche ein.
- dis.hasname¶
Sequenz von Bytecodes, die über einen Namen auf ein Attribut zugreifen.
- dis.hasjump¶
Sequenz von Bytecodes, die ein Sprungziel haben. Alle Sprünge sind relativ.
Hinzugefügt in Version 3.13.
- dis.haslocal¶
Sequenz von Bytecodes, die auf eine lokale Variable zugreifen.
- dis.hascompare¶
Sequenz von Bytecodes für boolesche Operationen.
- dis.hasexc¶
Sequenz von Bytecodes, die einen Ausnahmehandler setzen.
Hinzugefügt in Version 3.12.
- dis.hasjrel¶
Sequenz von Bytecodes, die ein relatives Sprungziel haben.
Veraltet seit Version 3.13: Alle Sprünge sind jetzt relativ. Verwenden Sie
hasjump.
- dis.hasjabs¶
Sequenz von Bytecodes, die ein absolutes Sprungziel haben.
Veraltet seit Version 3.13: Alle Sprünge sind jetzt relativ. Diese Liste ist leer.