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.

Geändert in Version 3.14: Die Kommandozeilenoption -P und das Argument show_positions wurden hinzugefügt.

Die Kommandozeilenoption -S wurde 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 eine Bytecode-Instanz die Bytecode-Operationen als Instruction-Instanzen liefert.

Wenn first_line nicht None ist, 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 None ist, bezieht es sich auf einen Anweisungsoffset im disassemblierten Code. Wenn dies gesetzt ist, zeigt dis() eine Markierung für die „aktuelle Anweisung“ gegen den angegebenen Opcode an.

Wenn show_caches True ist, zeigt dis() Inline-Cache-Einträge an, die vom Interpreter zum Spezialisieren des Bytecodes verwendet werden.

Wenn adaptive True ist, zeigt dis() spezialisierten Bytecode an, der sich vom ursprünglichen Bytecode unterscheiden kann.

Wenn show_offsets True ist, enthält dis() Anweisungsoffsets in der Ausgabe.

Wenn show_positions True ist, enthält dis() 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=0 bedeutet keine Rekursion.

Wenn show_caches True ist, zeigt diese Funktion Inline-Cache-Einträge an, die vom Interpreter zum Spezialisieren des Bytecodes verwendet werden.

Wenn adaptive True ist, 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:

  1. 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.

  2. die aktuelle Anweisung, angezeigt durch -->,

  3. eine bezeichnete Anweisung, angezeigt durch >>,

  4. die Adresse der Anweisung,

  5. der Opcode-Name,

  6. die Operationenparameter und

  7. 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 Instruction benannten Tupeln, die die Details jeder Operation im übergebenen Code angeben.

Wenn first_line nicht None ist, 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 Attribute co_firstlineno und co_lnotab des Codeobjekts verwendet.

Geändert in Version 3.13: Zeilennummern können None sein 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 True ist, gibt stack_effect() den Stack-Effekt des Springens zurück. Wenn jump False ist, gibt es den Stack-Effekt des Nicht-Springens zurück. Und wenn jump None (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 oparg weggelassen wird (oder None), wird der Stack-Effekt nun für oparg=0 zurückgegeben. Zuvor war dies ein Fehler für Opcodes, die ihr Arg verwenden. Es ist auch kein Fehler mehr, einen ganzzahligen oparg zu übergeben, wenn der opcode ihn nicht verwendet; der oparg wird 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

oparg

Alias für arg

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_ARG Operationen, falls vorhanden; andernfalls gleich offset

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, andernfalls False

line_number

Quellcodezeilennummer, die diesem Opcode zugeordnet ist (falls vorhanden), andernfalls None

is_jump_target

True, wenn anderer Code hierhin springt, andernfalls False

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), wobei name und size das Cache-Format beschreiben und data den Inhalt des Caches darstellt. cache_info ist None, wenn die Anweisung keine Caches hat.

Hinzugefügt in Version 3.4.

Geändert in Version 3.11: Feld positions wurde hinzugefügt.

Geändert in Version 3.13: Feld starts_line geändert.

Hinzugefügte Felder: start_offset, cache_offset, end_offset, baseopname, baseopcode, jump_target, oparg, line_number und cache_info.

class dis.Positions

Falls die Informationen nicht verfügbar sind, können einige Felder None sein.

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_LEFT und BRANCH_RIGHT Events für sys.monitoring aufzuzeichnen.

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 mit show_caches=True angezeigt 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 es STACK[-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 Opcode BINARY_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]), wobei get_awaitable(o) o zurückgibt, wenn o ein Coroutine-Objekt oder ein Generator-Objekt mit dem Flag CO_ITERABLE_COROUTINE ist, oder o.__await__ auflöst.

Wenn der Operand where ungleich 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. Siehe GET_AWAITABLE für Details zu get_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 in STACK[-2] und die ausgelöste Ausnahme in STACK[-1]. Beide werden gepoppt. Wenn die Ausnahme nicht StopAsyncIteration ist, 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() oder close() im aktuellen Frame ausgelöst wird. Wenn STACK[-1] eine Instanz von StopIteration ist, werden drei Werte vom Stack gepoppt und deren value-Mitglied geschoben. Andernfalls wird STACK[-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 ist STACK[-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, und 0 andernfalls.

SETUP_ANNOTATIONS

Prüft, ob __annotations__ in locals() definiert ist; wenn nicht, wird es als leeres dict eingerichtet. 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_lasti des 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 except durch. Testet, ob STACK[-2] eine Ausnahme ist, die mit STACK[-1] übereinstimmt. Poppt STACK[-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. Wendet split(STACK[-1]) auf die Ausnahme-Gruppe an, die STACK[-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 und None geschoben.

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 einer with-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, um AssertionError zu 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 in match-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 von collections.abc.Mapping ist (oder, technischer ausgedrückt: wenn sie das Py_TPFLAGS_MAPPING Flag in ihren tp_flags gesetzt hat), wird True auf den Stack gelegt. Andernfalls wird False auf den Stack gelegt.

Hinzugefügt in Version 3.10.

MATCH_SEQUENCE

Wenn STACK[-1] eine Instanz von collections.abc.Sequence ist und keine Instanz von str/bytes/bytearray ist (oder, technischer ausgedrückt: wenn sie das Py_TPFLAGS_SEQUENCE Flag in ihren tp_flags gesetzt hat), wird True auf den Stack gelegt. Andernfalls wird False auf den Stack gelegt.

Hinzugefügt in Version 3.10.

MATCH_KEYS

STACK[-1] ist ein Tupel von Mapping-Schlüsseln, und STACK[-2] ist das Trefferobjekt. Wenn STACK[-2] alle Schlüssel in STACK[-1] enthält, wird ein Tupel mit den entsprechenden Werten auf den Stack gelegt. Andernfalls wird None auf 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 Attribut co_names des Code-Objekts. Der Compiler versucht, STORE_FAST oder STORE_GLOBAL zu verwenden, wenn möglich.

DELETE_NAME(namei)

Implementiert del name, wobei *namei* der Index in das Attribut co_names des 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_ARG kodiert. 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 = d wird nach der Ausführung als STACK.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_names des Code-Objekts ist.

DELETE_ATTR(namei)

Implementiert

obj = STACK.pop()
del obj.name

wobei *namei* der Index des Namens in co_names des 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 i auf den Stack. i muss im Bereich range(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_DEREF und LOAD_FROM_DICT_OR_GLOBALS vorzubereiten.

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 bei LOAD_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 format auf 2 gesetzt.

Wenn das niedrigste Bit von format gesetzt ist, zeigt dies an, dass die Interpolation eine Formatierungsspezifikation enthält.

Wenn format >> 2 ungleich Null ist, bedeutet dies, dass die Interpolation eine Konvertierung enthält. Der Wert von format >> 2 ist der Konvertierungstyp (0 für keine Konvertierung, 1 für !s, 2 für !r und 3 fü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 * count Elemente 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 namei nicht gesetzt ist, ersetzt dies STACK[-1] durch getattr(STACK[-1], co_names[namei>>1]).

Wenn das niedrigste Bit von namei gesetzt ist, wird versucht, eine Methode namens co_names[namei>>1] aus dem Objekt STACK[-1] zu laden. STACK[-1] wird vom Stack geholt. Dieser Bytecode unterscheidet zwei Fälle: Wenn STACK[-1] eine Methode mit dem korrekten Namen hat, legt der Bytecode die ungebundene Methode und STACK[-1] auf den Stack. STACK[-1] wird als erstes Argument (self) von CALL oder CALL_KW beim Aufruf der ungebundenen Methode verwendet. Andernfalls werden NULL und das von der Attributsuche zurückgegebene Objekt auf den Stack gelegt.

Geändert in Version 3.12: Wenn das niedrigste Bit von namei gesetzt ist, wird vor dem Attribut bzw. der ungebundenen Methode ein NULL oder self auf 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().attr und super(cls, self).method(), super(cls, self).attr).

Er holt drei Werte vom Stack (von oben nach unten)

  • self: das erste Argument der aktuellen Methode

  • cls: die Klasse, innerhalb derer die aktuelle Methode definiert wurde

  • das globale super

Bezüglich seines Arguments verhält er sich ähnlich wie LOAD_ATTR, außer dass namei um 2 Bits nach links verschoben wird statt um 1.

Das niedrigste Bit von namei signalisiert den Versuch, eine Methode zu laden, wie bei LOAD_ATTR, was dazu führt, dass NULL und die geladene Methode gepusht werden. Wenn es nicht gesetzt ist, wird ein einzelner Wert auf den Stack gelegt.

Das zweitniedrigste Bit von namei bedeutet, wenn es gesetzt ist, dass dies ein Zwei-Argument-Aufruf von super() 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 von opname gesetzt ist (opname & 16), sollte das Ergebnis zu bool koordiniert werden.

Geändert in Version 3.13: Das fünftniedrigste Bit des oparg zeigt nun eine erzwungene Konvertierung zu bool an.

IS_OP(invert)

Führt den is-Vergleich durch, oder is not, wenn invert 1 ist.

Hinzugefügt in Version 3.9.

CONTAINS_OP(invert)

Führt den in-Vergleich durch, oder not in, wenn invert 1 ist.

Hinzugefügt in Version 3.9.

IMPORT_NAME(namei)

Importiert das Modul co_names[namei]. STACK[-1] und STACK[-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 nachfolgende STORE_FAST-Anweisung den Namensraum.

IMPORT_FROM(namei)

Lädt das Attribut co_names[namei] aus dem Modul, das in STACK[-1] gefunden wurde. Das resultierende Objekt wird auf den Stack gelegt, um anschließend von einer STORE_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] nicht None ist, 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] None ist, 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 namei gesetzt ist, wird vor der globalen Variable ein NULL auf 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 UnboundLocalError auslö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] und co_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] und co_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 einen UnboundLocalError aus, 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 pusht NULL auf den Stack, wenn die lokale Variable nicht initialisiert wurde) und setzt co_varnames[var_num] auf NULL.

Hinzugefügt in Version 3.12.

STORE_FAST(var_num)

Speichert STACK.pop() in der lokalen Variable co_varnames[var_num].

STORE_FAST_STORE_FAST(var_nums)

Speichert STACK[-1] in co_varnames[var_nums >> 4] und STACK[-2] in co_varnames[var_nums & 15].

Hinzugefügt in Version 3.13.

STORE_FAST_LOAD_FAST(var_nums)

Speichert STACK.pop() in der lokalen Variable co_varnames[var_nums >> 4] und pusht eine Referenz auf die lokale Variable co_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 i des 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: i wird nicht mehr um die Länge von co_varnames versetzt.

LOAD_FROM_DICT_OR_DEREF(i)

Entnimmt ein Mapping vom Stack und sucht den Namen, der mit Slot i des Speichers für "schnelle lokale Variablen" assoziiert ist, in diesem Mapping. Wenn der Name dort nicht gefunden wird, wird er aus der Zelle im Slot i geladen, ähnlich wie bei LOAD_DEREF. Dies wird zum Laden von Closure-Variablen in Klassenkörpern (was zuvor LOAD_CLASSDEREF verwendete) 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 Slot i des Speichers für "schnelle lokale Variablen".

Geändert in Version 3.11: i wird nicht mehr um die Länge von co_varnames versetzt.

DELETE_DEREF(i)

Leert die Zelle im Slot i des Speichers für "schnelle lokale Variablen". Wird von der del-Anweisung verwendet.

Hinzugefügt in Version 3.2.

Geändert in Version 3.11: i wird nicht mehr um die Länge von co_varnames versetzt.

COPY_FREE_VARS(n)

Kopiert die n freien (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 argc

  • 0: raise (vorherige Ausnahme erneut auslösen)

  • 1: raise STACK[-1] (Ausnahmeinstanz oder -typ auf STACK[-1] auslösen)

  • 2: raise STACK[-2] from STACK[-1] (Ausnahmeinstanz oder -typ auf STACK[-2] mit __cause__ als STACK[-1] auslösen)

CALL(argc)

Ruft ein aufrufbares Objekt mit der von argc angegebenen Anzahl von Argumenten auf. Auf dem Stack befinden sich (in aufsteigender Reihenfolge)

  • Das aufrufbare Objekt

  • self oder NULL

  • Die verbleibenden positionsabhängigen Argumente

argc ist die Gesamtzahl der positionsabhängigen Argumente, exklusive self.

CALL entnimmt 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_KW behandelt.

CALL_KW(argc)

Ruft ein aufrufbares Objekt mit der von argc angegebenen Anzahl von Argumenten auf, einschließlich eines oder mehrerer benannter Argumente. Auf dem Stack befinden sich (in aufsteigender Reihenfolge)

  • Das aufrufbare Objekt

  • self oder NULL

  • Die verbleibenden positionsabhängigen Argumente

  • Die benannten Argumente

  • Ein Tupel von Namen für benannte Argumente

argc ist die Gesamtzahl der positionsabhängigen und benannten Argumente, exklusive self. Die Länge des Tupels von Namen für benannte Argumente ist die Anzahl der benannten Argumente.

CALL_KW entnimmt 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_EX entnimmt 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 NULL auf den Stack. Wird in der Aufrufsequenz verwendet, um das von LOAD_METHOD für Nicht-Methodenaufrufe gepushte NULL abzugleichen.

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 0x04 ist 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 auf STACK[-2]; verbraucht beide und lässt die Funktion auf STACK[-1] zurück. Das Flag bestimmt, welches Attribut gesetzt wird.

  • 0x01 ein Tupel von Standardwerten für positionsabhängige und positionsabhängige/benannte Parameter in positionsabhängiger Reihenfolge

  • 0x02 ein Dictionary von Standardwerten für nur-benannte Parameter

  • 0x04 ein Tupel von Strings mit den Annotationen der Parameter

  • 0x08 ein 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_ARG erlaubt, die ein Argument von zwei bis vier Bytes bilden.

CONVERT_VALUE(oparg)

Konvertiert den Wert in einen String, abhängig von oparg

value = STACK.pop()
result = func(value)
STACK.append(result)
  • oparg == 1: ruft str() auf value auf

  • oparg == 2: ruft repr() auf value auf

  • oparg == 3: ruft ascii() 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, und STACK[-3] ist das Abgleichobjekt. count ist die Anzahl der positionsabhängigen Unter-Muster.

Entnimmt STACK[-1], STACK[-2] und STACK[-3]. Wenn STACK[-3] eine Instanz von STACK[-2] ist und die positionsabhängigen und benannten Attribute besitzt, die von count und STACK[-1] gefordert werden, wird ein Tupel der extrahierten Attribute gepusht. Andernfalls wird None gepusht.

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 context besteht aus zwei Teilen. Die beiden niedrigsten Bits geben an, wo RESUME auftritt.

  • 0 Der Beginn einer Funktion, die weder ein Generator, eine Coroutine noch ein asynchroner Generator ist.

  • 1 Nach einem yield-Ausdruck.

  • 2 Nach einem yield from-Ausdruck.

  • 3 Nach einem await-Ausdruck.

Das nächste Bit ist 1, wenn RESUME auf der Ausnahme-Tiefe 1 auftritt, und 0 andernfalls.

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 in yield from und await-Anweisungen verwendet.

Wenn der Aufruf StopIteration auslöst, wird der oberste Wert vom Stack entnommen, das value-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_ARGUMENT und >= 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_ARGUMENT ignorieren es. Zuvor hatten nur Opcodes >= HAVE_ARGUMENT ein Argument.

Geändert in Version 3.12: Pseudobefehle wurden dem dis-Modul hinzugefügt, und für sie gilt nicht, dass ein Vergleich mit HAVE_ARGUMENT angibt, 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 setzt STACK[-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_INVALID

Nicht gültig

INTRINSIC_PRINT

Gibt das Argument auf der Standardausgabe aus. Wird in der REPL verwendet.

INTRINSIC_IMPORT_STAR

Führt import * für das benannte Modul aus.

INTRINSIC_STOPITERATION_ERROR

Extrahiert den Rückgabewert aus einer StopIteration-Ausnahme.

INTRINSIC_ASYNC_GEN_WRAP

Wickelt einen asynchronen Generatorwert.

INTRINSIC_UNARY_POSITIVE

Führt die unäre Operation + aus.

INTRINSIC_LIST_TO_TUPLE

Konvertiert eine Liste in ein Tupel.

INTRINSIC_TYPEVAR

Erstellt einen typing.TypeVar.

INTRINSIC_PARAMSPEC

Erstellt einen typing.ParamSpec.

INTRINSIC_TYPEVARTUPLE

Erstellt einen typing.TypeVarTuple.

INTRINSIC_SUBSCRIPT_GENERIC

Gibt typing.Generic mit dem Argument subscripted zurück.

INTRINSIC_TYPEALIAS

Erstellt einen typing.TypeAliasType; wird in der type-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_INVALID

Nicht gültig

INTRINSIC_PREP_RERAISE_STAR

Berechnet die ExceptionGroup, die aus einem try-except* ausgelöst werden soll.

INTRINSIC_TYPEVAR_WITH_BOUND

Erstellt einen typing.TypeVar mit einer Bindung.

INTRINSIC_TYPEVAR_WITH_CONSTRAINTS

Erstellt einen typing.TypeVar mit Einschränkungen.

INTRINSIC_SET_FUNCTION_TYPE_PARAMS

Setzt das Attribut __type_params__ einer Funktion.

Hinzugefügt in Version 3.12.

LOAD_SPECIAL

Führt eine spezielle Methodensuche auf STACK[-1] durch. Wenn type(STACK[-1]).__xxx__ eine Methode ist, wird type(STACK[-1]).__xxx__; STACK[-1] auf den Stack gelegt. Wenn type(STACK[-1]).__xxx__ keine Methode ist, wird STACK[-1].__xxx__; NULL auf 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, damit RERAISE sie 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 bei target ü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 bei target übertragen wird.

Diese Variante wird in with und async 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_CLEANUP oder SETUP_WITH zugeordnet 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 i des Speichers für "schnelle lokale Variablen".

Beachten Sie, dass LOAD_CLOSURE im Assembler durch LOAD_FAST ersetzt 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.