dis — Desensamblador para bytecode de Python

Código fuente: Lib/dis.py


El módulo dis admite el análisis de CPython bytecode al desarmarlo. El bytecode de CPython que este módulo toma como entrada se define en el archivo Include/opcode.h y lo utilizan el compilador y el intérprete.

CPython implementation detail: Bytecode es un detalle de implementación del intérprete CPython. No se garantiza que el bytecode no se agregará, eliminará ni cambiará entre las versiones de Python. El uso de este módulo no debe considerarse para trabajar en diferentes máquinas virtuales Python o versiones de Python.

Distinto en la versión 3.6: Use 2 bytes para cada instrucción. Anteriormente, el número de bytes variaba según la instrucción.

Distinto en la versión 3.11: Some instructions are accompanied by one or more inline cache entries, which take the form of CACHE instructions. These instructions are hidden by default, but can be shown by passing show_caches=True to any dis utility.

Ejemplo: dada la función myfunc():

def myfunc(alist):
    return len(alist)

the following command can be used to display the disassembly of myfunc():

>>> dis.dis(myfunc)
  2           0 RESUME                   0

  3           2 LOAD_GLOBAL              1 (NULL + len)
             14 LOAD_FAST                0 (alist)
             16 CALL                     1
             26 RETURN_VALUE

(El «2» es un número de línea).

Análisis de bytecode

Nuevo en la versión 3.4.

La API de análisis de bytecode permite que partes del código Python se envuelvan en un objeto Bytecode que proporciona un fácil acceso a los detalles del código compilado.

class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False)

Analiza el bytecode correspondiente a una función, generador, generador asíncrono, corutina, método, cadena de código fuente o un objeto de código (como lo retorna compile()).

Este es un contenedor conveniente para muchas de las funciones enumeradas a continuación, en particular get_instructions(), ya que iterar sobre una instancia de Bytecode produce las operaciones de bytecode como instancias de Instruction.

Si first_line no es None, indica el número de línea que se debe informar para la primera línea de origen en el código desmontado. De lo contrario, la información de la línea de origen (si la hay) se toma directamente del objeto de código desmontado.

Si current_offset no es None, se refiere a un desplazamiento de instrucción en el código desmontado. Establecer esto significa dis() mostrará un marcador de «instrucción actual» contra el código de operación especificado.

classmethod from_traceback(tb, *, show_caches=False)

Construye una instancia de Bytecode a partir del traceback dado, estableciendo current_offset en la instrucción responsable de la excepción.

codeobj

El objeto de código compilado.

first_line

La primera línea de origen del objeto de código (si está disponible)

dis()

Retorna una vista formateada de las operaciones de bytecode (lo mismo que impreso por dis.dis(), pero retornado como una cadena de caracteres multilínea).

info()

Retorna una cadena de caracteres multilínea formateada con información detallada sobre el objeto de código, como code_info().

Distinto en la versión 3.7: Esto ahora puede manejar objetos generadores asíncronos y de corutinas.

Distinto en la versión 3.11: Added the show_caches parameter.

Example:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST
CALL
RETURN_VALUE

Funciones de análisis

El módulo dis también define las siguientes funciones de análisis que convierten la entrada directamente en la salida deseada. Pueden ser útiles si solo se realiza una sola operación, por lo que el objeto de análisis intermedio no es útil:

dis.code_info(x)

Retorna una cadena de caracteres multilínea formateada con información detallada del objeto de código para la función, generador, generador asíncrono, corutina, método, cadena de código fuente u objeto de código suministrados.

Tenga en cuenta que el contenido exacto de las cadenas de información de código depende en gran medida de la implementación y puede cambiar arbitrariamente en las diferentes máquinas virtuales Python o las versiones de Python.

Nuevo en la versión 3.2.

Distinto en la versión 3.7: Esto ahora puede manejar objetos generadores asíncronos y de corutinas.

dis.show_code(x, *, file=None)

Imprime información detallada del objeto de código para la función, método, cadena de código fuente u objeto de código suministrado en file (o sys.stdout si file no está especificado).

Esta es una abreviatura conveniente para print(code_info(x), file=file), destinado a la exploración interactiva en el indicador del intérprete (prompt).

Nuevo en la versión 3.2.

Distinto en la versión 3.4: Agrega un parámetro file.

dis.dis(x=None, *, file=None, depth=None, show_caches=False)

Desmontar el objeto x. x puede denotar un módulo, una clase, un método, una función, un generador, un generador asíncrono, una corutina, un objeto de código, una cadena de código fuente o una secuencia de bytes de código de bytes sin procesar. Para un módulo, desmonta todas las funciones. Para una clase, desmonta todos los métodos (incluidos los métodos de clase y estáticos). Para un objeto de código o secuencia de bytecode sin procesar, imprime una línea por instrucción de bytecode. También desmonta recursivamente objetos de código anidados (el código de comprensiones, expresiones generadoras y funciones anidadas, y el código utilizado para construir clases anidadas). Las cadenas de caracteres se compilan primero en objetos de código con la función incorporada compile() antes de desmontarse. Si no se proporciona ningún objeto, esta función desmonta el último rastreo.

El desensamblaje se escribe como texto en el argumento file proporcionado si se proporciona y, de lo contrario, sys.stdout.

La profundidad máxima de recursión está limitada por depth a menos que sea None. depth=0 significa que no hay recursión.

Distinto en la versión 3.4: Agrega un parámetro file.

Distinto en la versión 3.7: Desensamblaje recursivo implementado y parámetro agregado depth.

Distinto en la versión 3.7: Esto ahora puede manejar objetos generadores asíncronos y de corutinas.

Distinto en la versión 3.11: Added the show_caches parameter.

dis.distb(tb=None, *, file=None, show_caches=False)

Desmonta la función de inicio de pila de un rastreo, utilizando el último rastreo si no se pasó ninguno. Se indica la instrucción que causa la excepción.

El desensamblaje se escribe como texto en el argumento file proporcionado si se proporciona y, de lo contrario, sys.stdout.

Distinto en la versión 3.4: Agrega un parámetro file.

Distinto en la versión 3.11: Added the show_caches parameter.

dis.disassemble(code, lasti=- 1, *, file=None, show_caches=False)
dis.disco(code, lasti=- 1, *, file=None, show_caches=False)

Desmonta un objeto de código, que indica la última instrucción si se proporcionó lasti. La salida se divide en las siguientes columnas:

  1. el número de línea, para la primera instrucción de cada línea

  2. la instrucción actual, indicada como -->,

  3. una instrucción etiquetada, indicada con >>,

  4. la dirección de la instrucción,

  5. el nombre del código de operación,

  6. parámetros de operación, y

  7. interpretación de los parámetros entre paréntesis.

La interpretación de parámetros reconoce nombres de variables locales y globales, valores constantes, objetivos de ramificación y operadores de comparación.

El desensamblaje se escribe como texto en el argumento file proporcionado si se proporciona y, de lo contrario, sys.stdout.

Distinto en la versión 3.4: Agrega un parámetro file.

Distinto en la versión 3.11: Added the show_caches parameter.

dis.get_instructions(x, *, first_line=None, show_caches=False)

Retorna un iterador sobre las instrucciones en la función, método, cadena de código fuente u objeto de código suministrado.

El iterador genera una serie de tuplas con nombre Instruction que dan los detalles de cada operación en el código suministrado.

Si first_line no es None, indica el número de línea que se debe informar para la primera línea de origen en el código desmontado. De lo contrario, la información de la línea de origen (si la hay) se toma directamente del objeto de código desmontado.

Nuevo en la versión 3.4.

Distinto en la versión 3.11: Added the show_caches parameter.

dis.findlinestarts(code)

This generator function uses the co_lines method of the code object code to find the offsets which are starts of lines in the source code. They are generated as (offset, lineno) pairs.

Distinto en la versión 3.6: Los números de línea pueden estar disminuyendo. Antes, siempre estaban aumentando.

Distinto en la versión 3.10: The PEP 626 co_lines method is used instead of the co_firstlineno and co_lnotab attributes of the code object.

dis.findlabels(code)

Detecta todos los desplazamientos en la cadena de caracteres de código de byte compilada code que son objetivos de salto y retorna una lista de estos desplazamientos.

dis.stack_effect(opcode, oparg=None, *, jump=None)

Calcula el efecto de pila de opcode con el argumento oparg.

Si el código tiene un objetivo de salto y jump es True, stack_effect() retornará el efecto de pila del salto. Si jump es False, retornará el efecto de acumulación de no saltar. Y si jump es None (predeterminado), retornará el efecto de acumulación máxima de ambos casos.

Nuevo en la versión 3.4.

Distinto en la versión 3.8: Agrega un parámetro jump.

Instrucciones bytecode de Python

La función get_instructions() y clase Bytecode proporcionan detalles de las instrucciones bytecode como instancias Instruction:

class dis.Instruction

Detalles para una operación de bytecode

opcode

código numérico para la operación, correspondiente a los valores del opcode listados a continuación y los valores de bytecode en Colecciones opcode.

opname

nombre legible por humanos para la operación

arg

argumento numérico para la operación (si existe), de lo contrario None

argval

resolved arg value (if any), otherwise None

argrepr

human readable description of operation argument (if any), otherwise an empty string.

offset

índice de inicio de operación dentro de la secuencia de bytecode

starts_line

línea iniciada por este código de operación (si existe), de lo contrario None

is_jump_target

True si otro código salta aquí, de lo contrario, False

positions

dis.Positions object holding the start and end locations that are covered by this instruction.

Nuevo en la versión 3.4.

Distinto en la versión 3.11: Field positions is added.

class dis.Positions

In case the information is not available, some fields might be None.

lineno
end_lineno
col_offset
end_col_offset

Nuevo en la versión 3.11.

El compilador de Python actualmente genera las siguientes instrucciones de bytecode.

Instrucciones generales

NOP

Do nothing code. Used as a placeholder by the bytecode optimizer, and to generate line tracing events.

POP_TOP

Elimina el elemento de la parte superior de la pila (TOS).

COPY(i)

Push the i-th item to the top of the stack. The item is not removed from its original location.

Nuevo en la versión 3.11.

SWAP(i)

Swap TOS with the item at position i.

Nuevo en la versión 3.11.

CACHE

Rather than being an actual instruction, this opcode is used to mark extra space for the interpreter to cache useful data directly in the bytecode itself. It is automatically hidden by all dis utilities, but can be viewed with show_caches=True.

Logically, this space is part of the preceding instruction. Many opcodes expect to be followed by an exact number of caches, and will instruct the interpreter to skip over them at runtime.

Populated caches can look like arbitrary instructions, so great care should be taken when reading or modifying raw, adaptive bytecode containing quickened data.

Nuevo en la versión 3.11.

Operaciones unarias

Las operaciones unarias toman la parte superior de la pila, aplican la operación y retornan el resultado a la pila.

UNARY_POSITIVE

Implementa TOS = +TOS.

UNARY_NEGATIVE

Implementa TOS = -TOS.

UNARY_NOT

Implementa TOS = not TOS.

UNARY_INVERT

Implementa TOS = ~TOS.

GET_ITER

Implementa TOS = iter(TOS).

GET_YIELD_FROM_ITER

Si TOS es un iterador generador o un objeto corutina se deja como está. De lo contrario, implementa TOS = iter(TOS).

Nuevo en la versión 3.5.

Binary and in-place operations

In the following, TOS is the top-of-stack. TOS1, TOS2, TOS3 are the second, third and fourth items on the stack, respectively.

Binary operations remove the top two items from the stack (TOS and TOS1). They perform the operation, then put the result back on the stack.

In-place operations are like binary operations, but the operation is done in-place when TOS1 supports it, and the resulting TOS may be (but does not have to be) the original TOS1.

BINARY_OP(op)

Implements the binary and in-place operators (depending on the value of op). TOS = TOS1 op TOS.

Nuevo en la versión 3.11.

BINARY_SUBSCR

Implementa TOS = TOS1[TOS].

STORE_SUBSCR

Implementa TOS1[TOS] = TOS2.

DELETE_SUBSCR

Implementa del TOS1[TOS].

BINARY_SLICE

Implements TOS = TOS2[TOS1:TOS].

Nuevo en la versión 3.12.

STORE_SLICE

Implements TOS2[TOS1:TOS] = TOS3.

Nuevo en la versión 3.12.

Opcodes de corutinas

GET_AWAITABLE(where)

Implementa TOS = get_awaitable(TOS), donde get_awaitable(o) retorna o si o es un objeto de corutina o un objeto generador con el indicador CO_ITERABLE_COROUTINE, o resuelve o.__await__.

If the where operand is nonzero, it indicates where the instruction occurs:

  • 1 After a call to __aenter__

  • 2 After a call to __aexit__

Nuevo en la versión 3.5.

Distinto en la versión 3.11: Previously, this instruction did not have an oparg.

GET_AITER

Implementa TOS = TOS.__aiter__().

Nuevo en la versión 3.5.

Distinto en la versión 3.7: Ya no se admite el retorno de objetos awaitable de __aiter__.

GET_ANEXT

Pushes get_awaitable(TOS.__anext__()) to the stack. See GET_AWAITABLE for details about get_awaitable.

Nuevo en la versión 3.5.

END_ASYNC_FOR

Terminates an async for loop. Handles an exception raised when awaiting a next item. If TOS is StopAsyncIteration pop 3 values from the stack and restore the exception state using the second of them. Otherwise re-raise the exception using the value from the stack. An exception handler block is removed from the block stack.

Nuevo en la versión 3.8:

Distinto en la versión 3.11: Exception representation on the stack now consist of one, not three, items.

CLEANUP_THROW

Handles an exception raised during a throw() or close() call through the current frame. If TOS is an instance of StopIteration, pop three values from the stack and push its value member. Otherwise, re-raise TOS.

Nuevo en la versión 3.12.

BEFORE_ASYNC_WITH

Resuelve __aenter__ y __aexit__ del objeto en la parte superior de la pila. Apila __aexit__ y el resultado de __aenter__() a la pila.

Nuevo en la versión 3.5.

Opcodes misceláneos

PRINT_EXPR

Implementa la declaración de expresión para el modo interactivo. TOS se elimina de la pila y se imprime. En modo no interactivo, una declaración de expresión termina con POP_TOP.

SET_ADD(i)

Llama a set.add(TOS1[-i], TOS). Se utiliza para implementar comprensiones de conjuntos.

LIST_APPEND(i)

Llama a list.append(TOS1[-i], TOS). Se utiliza para implementar listas por comprensión.

MAP_ADD(i)

Llama a dict.__setitem__(TOS1[-i], TOS1, TOS). Se utiliza para implementar comprensiones de diccionarios.

Nuevo en la versión 3.1.

Distinto en la versión 3.8: El valor del mapa es TOS y la clave del mapa es TOS1. Antes, esos fueron revertidos.

Para todas las instrucciones SET_ADD, LIST_APPEND y MAP_ADD, mientras el valor agregado o el par clave/valor aparece, el objeto contenedor permanece en la pila para que quede disponible para futuras iteraciones del bucle.

RETURN_VALUE

Retorna con TOS a quien llama la función.

YIELD_VALUE

Desapila TOS y lo genera (yield) de un generator.

Distinto en la versión 3.11: oparg set to be the stack depth, for efficient handling on frames.

SETUP_ANNOTATIONS

Comprueba si __anotaciones__ está definido en locals(), si no está configurado como un dict vacío. Este código de operación solo se emite si el cuerpo de una clase o módulo contiene anotaciones de variables estáticamente.

Nuevo en la versión 3.6.

IMPORT_STAR

Carga todos los símbolos que no comienzan con '_' directamente desde el TOS del módulo al espacio de nombres local. El módulo se desapila después de cargar todos los nombres. Este opcode implementa from module import *.

POP_EXCEPT

Pops a value from the stack, which is used to restore the exception state.

Distinto en la versión 3.11: Exception representation on the stack now consist of one, not three, items.

RERAISE

Re-raises the exception currently on top of the stack. If oparg is non-zero, pops an additional value from the stack which is used to set f_lasti of the current frame.

Nuevo en la versión 3.9.

Distinto en la versión 3.11: Exception representation on the stack now consist of one, not three, items.

PUSH_EXC_INFO

Pops a value from the stack. Pushes the current exception to the top of the stack. Pushes the value originally popped back to the stack. Used in exception handlers.

Nuevo en la versión 3.11.

CHECK_EXC_MATCH

Performs exception matching for except. Tests whether the TOS1 is an exception matching TOS. Pops TOS and pushes the boolean result of the test.

Nuevo en la versión 3.11.

CHECK_EG_MATCH

Performs exception matching for except*. Applies split(TOS) on the exception group representing TOS1.

In case of a match, pops two items from the stack and pushes the non-matching subgroup (None in case of full match) followed by the matching subgroup. When there is no match, pops one item (the match type) and pushes None.

Nuevo en la versión 3.11.

PREP_RERAISE_STAR

Combines the raised and reraised exceptions list from TOS, into an exception group to propagate from a try-except* block. Uses the original exception group from TOS1 to reconstruct the structure of reraised exceptions. Pops two items from the stack and pushes the exception to reraise or None if there isn’t one.

Nuevo en la versión 3.11.

WITH_EXCEPT_START

Calls the function in position 4 on the stack with arguments (type, val, tb) representing the exception at the top of the stack. Used to implement the call context_manager.__exit__(*exc_info()) when an exception has occurred in a with statement.

Nuevo en la versión 3.9.

Distinto en la versión 3.11: The __exit__ function is in position 4 of the stack rather than 7. Exception representation on the stack now consist of one, not three, items.

LOAD_ASSERTION_ERROR

Inserta AssertionError en la pila. Utilizado por la declaración assert.

Nuevo en la versión 3.9.

LOAD_BUILD_CLASS

Pushes builtins.__build_class__() onto the stack. It is later called to construct a class.

BEFORE_WITH(delta)

This opcode performs several operations before a with block starts. First, it loads __exit__() from the context manager and pushes it onto the stack for later use by WITH_EXCEPT_START. Then, __enter__() is called. Finally, the result of calling the __enter__() method is pushed onto the stack.

Nuevo en la versión 3.11.

GET_LEN

Apila len(TOS) en la pila.

Nuevo en la versión 3.10.

MATCH_MAPPING

Si TOS es una instancia de collections.abc.Mapping (o, más técnicamente, si tiene el indicador Py_TPFLAGS_MAPPING establecido en su tp_flags), apila True en la pila. De lo contrario apila False.

Nuevo en la versión 3.10.

MATCH_SEQUENCE

Si TOS es una instancia de collections.abc.Sequence y no es una instancia de str/bytes/bytearray (o, más técnicamente, si tiene el indicador Py_TPFLAGS_SEQUENCE establecido en su tp_flags), apila True en la pila. De lo contrario apila False.

Nuevo en la versión 3.10.

MATCH_KEYS

TOS is a tuple of mapping keys, and TOS1 is the match subject. If TOS1 contains all of the keys in TOS, push a tuple containing the corresponding values. Otherwise, push None.

Nuevo en la versión 3.10.

Distinto en la versión 3.11: Previously, this instruction also pushed a boolean value indicating success (True) or failure (False).

STORE_NAME(namei)

Implementa name = TOS. namei es el índice de name en el atributo co_names del objeto de código. El compilador intenta usar STORE_FAST o STORE_GLOBAL si es posible.

DELETE_NAME(namei)

Implementa del name, donde namei es el índice en atributo co_names del objeto de código.

UNPACK_SEQUENCE(count)

Descomprime TOS en count valores individuales, que se colocan en la pila de derecha a izquierda.

UNPACK_EX(counts)

Implementa la asignación con un objetivo destacado: desempaqueta un iterable en TOS en valores individuales, donde el número total de valores puede ser menor que el número de elementos en el iterable: uno de los nuevos valores será una lista de todos los elementos sobrantes.

El byte bajo de count es el número de valores antes del valor de la lista, el byte alto de count es el número de valores después de él. Los valores resultantes se colocan en la pila de derecha a izquierda.

STORE_ATTR(namei)

Implementa TOS.name = TOS1, donde namei es el índice del nombre en co_names.

DELETE_ATTR(namei)

Implementa del TOS.name, usando namei como índice en co_names.

STORE_GLOBAL(namei)

Funciona como STORE_NAME, pero almacena el nombre como global.

DELETE_GLOBAL(namei)

Funciona como DELETE_NAME, pero elimina un nombre global.

LOAD_CONST(consti)

Apila co_consts[consti] en la pila.

LOAD_NAME(namei)

Apila el valor asociado con co_names [namei] en la pila.

BUILD_TUPLE(count)

Crea una tupla que consume elementos count de la pila, y apila la tupla resultante a la pila.

BUILD_LIST(count)

Funciona como BUILD_TUPLE, pero crea una lista.

BUILD_SET(count)

Funciona como BUILD_TUPLE, pero crea un conjunto.

BUILD_MAP(count)

Apila un nuevo objeto de diccionario en la pila. Desapila 2 * count elementos para que el diccionario contenga count entradas: {..., TOS3: TOS2, TOS1: TOS}.

Distinto en la versión 3.5: El diccionario se crea a partir de elementos de la pila en lugar de crear un diccionario vacío dimensionado previamente para contener count elementos.

BUILD_CONST_KEY_MAP(count)

La versión de BUILD_MAP especializada para claves constantes. Desapila el elemento superior en la pila que contiene una tupla de claves, luego, a partir de TOS1, muestra los valores count para formar valores en el diccionario incorporado.

Nuevo en la versión 3.6.

BUILD_STRING(count)

Concatena count cadenas de caracteres de la pila y empuja la cadena de caracteres resultante en la pila.

Nuevo en la versión 3.6.

LIST_TO_TUPLE

Saca una lista de la pila y empuja una tupla que contiene los mismos valores.

Nuevo en la versión 3.9.

LIST_EXTEND(i)

Llama a list.extend(TOS1[-i], TOS). Se utiliza para crear listas.

Nuevo en la versión 3.9.

SET_UPDATE(i)

Llama a set.update(TOS1[-i], TOS). Se usa para construir decorados.

Nuevo en la versión 3.9.

DICT_UPDATE(i)

Llama a dict.update(TOS1[-i], TOS). Se usa para construir dictados.

Nuevo en la versión 3.9.

DICT_MERGE(i)

Como DICT_UPDATE pero lanza una excepción para claves duplicadas.

Nuevo en la versión 3.9.

LOAD_ATTR(namei)

If the low bit of namei is not set, this replaces TOS with getattr(TOS, co_names[namei>>1]).

If the low bit of namei is set, this will attempt to load a method named co_names[namei>>1] from the TOS object. TOS is popped. This bytecode distinguishes two cases: if TOS has a method with the correct name, the bytecode pushes the unbound method and TOS. TOS will be used as the first argument (self) by CALL when calling the unbound method. Otherwise, NULL and the object return by the attribute lookup are pushed.

Distinto en la versión 3.12: If the low bit of namei is set, then a NULL or self is pushed to the stack before the attribute or unbound method respectively.

COMPARE_OP(opname)

Realiza una operación booleana. El nombre de la operación se puede encontrar en cmp_op[opname].

IS_OP(invert)

Realiza una comparación is o is not si invert es 1.

Nuevo en la versión 3.9.

CONTAINS_OP(invert)

Realiza una comparación in o not in si invert es 1.

Nuevo en la versión 3.9.

IMPORT_NAME(namei)

Importa el módulo co_names[namei]. TOS y TOS1 aparecen y proporcionan los argumentos fromlist y level de __import__(). El objeto del módulo se empuja a la pila. El espacio de nombres actual no se ve afectado: para una instrucción de importación adecuada, una instrucción posterior STORE_FAST modifica el espacio de nombres.

IMPORT_FROM(namei)

Carga el atributo co_names[namei] del módulo que se encuentra en TOS. El objeto resultante se apila en la pila, para luego ser almacenado por la instrucción STORE_FAST.

JUMP_FORWARD(delta)

Incrementa el contador de bytecode en delta.

JUMP_BACKWARD(delta)

Decrements bytecode counter by delta. Checks for interrupts.

Nuevo en la versión 3.11.

JUMP_BACKWARD_NO_INTERRUPT(delta)

Decrements bytecode counter by delta. Does not check for interrupts.

Nuevo en la versión 3.11.

POP_JUMP_IF_TRUE(delta)

If TOS is true, increments the bytecode counter by delta. TOS is popped.

Distinto en la versión 3.11: The oparg is now a relative delta rather than an absolute target. This opcode is a pseudo-instruction, replaced in final bytecode by the directed versions (forward/backward).

Distinto en la versión 3.12: This is no longer a pseudo-instruction.

POP_JUMP_IF_FALSE(delta)

If TOS is false, increments the bytecode counter by delta. TOS is popped.

Distinto en la versión 3.11: The oparg is now a relative delta rather than an absolute target. This opcode is a pseudo-instruction, replaced in final bytecode by the directed versions (forward/backward).

Distinto en la versión 3.12: This is no longer a pseudo-instruction.

POP_JUMP_IF_NOT_NONE(delta)

If TOS is not None, increments the bytecode counter by delta. TOS is popped.

Nuevo en la versión 3.11.

Distinto en la versión 3.12: This is no longer a pseudo-instruction.

POP_JUMP_IF_NONE(delta)

If TOS is None, increments the bytecode counter by delta. TOS is popped.

Nuevo en la versión 3.11.

Distinto en la versión 3.12: This is no longer a pseudo-instruction.

JUMP_IF_TRUE_OR_POP(delta)

If TOS is true, increments the bytecode counter by delta and leaves TOS on the stack. Otherwise (TOS is false), TOS is popped.

Nuevo en la versión 3.1.

Distinto en la versión 3.11: The oparg is now a relative delta rather than an absolute target.

JUMP_IF_FALSE_OR_POP(delta)

If TOS is false, increments the bytecode counter by delta and leaves TOS on the stack. Otherwise (TOS is true), TOS is popped.

Nuevo en la versión 3.1.

Distinto en la versión 3.11: The oparg is now a relative delta rather than an absolute target.

FOR_ITER(delta)

TOS es un iterador. Llama a su método __next__(). Si esto produce un nuevo valor, lo apila en la pila (dejando el iterador debajo de él). Si el iterador indica que está agotado, se abre TOS y el contador de código de bytes se incrementa en delta.

LOAD_GLOBAL(namei)

Loads the global named co_names[namei>>1] onto the stack.

Distinto en la versión 3.11: If the low bit of namei is set, then a NULL is pushed to the stack before the global variable.

LOAD_FAST(var_num)

Apila una referencia al local co_varnames[var_num] sobre la pila.

Distinto en la versión 3.12: This opcode is now only used in situations where the local variable is guaranteed to be initialized. It cannot raise UnboundLocalError.

LOAD_FAST_CHECK(var_num)

Pushes a reference to the local co_varnames[var_num] onto the stack, raising an UnboundLocalError if the local variable has not been initialized.

Nuevo en la versión 3.12.

STORE_FAST(var_num)

Almacena TOS en el local co_varnames[var_num].

DELETE_FAST(var_num)

Elimina la co_varnames[var_num] local.

MAKE_CELL(i)

Creates a new cell in slot i. If that slot is empty then that value is stored into the new cell.

Nuevo en la versión 3.11.

LOAD_CLOSURE(i)

Pushes a reference to the cell contained in slot i of the «fast locals» storage. The name of the variable is co_fastlocalnames[i].

Note that LOAD_CLOSURE is effectively an alias for LOAD_FAST. It exists to keep bytecode a little more readable.

Distinto en la versión 3.11: i is no longer offset by the length of co_varnames.

LOAD_DEREF(i)

Loads the cell contained in slot i of the «fast locals» storage. Pushes a reference to the object the cell contains on the stack.

Distinto en la versión 3.11: i is no longer offset by the length of co_varnames.

LOAD_CLASSDEREF(i)

Al igual que LOAD_DEREF pero primero verifica el diccionario local antes de consultar la celda. Esto se usa para cargar variables libres en los cuerpos de clase.

Nuevo en la versión 3.4.

Distinto en la versión 3.11: i is no longer offset by the length of co_varnames.

STORE_DEREF(i)

Stores TOS into the cell contained in slot i of the «fast locals» storage.

Distinto en la versión 3.11: i is no longer offset by the length of co_varnames.

DELETE_DEREF(i)

Empties the cell contained in slot i of the «fast locals» storage. Used by the del statement.

Nuevo en la versión 3.2.

Distinto en la versión 3.11: i is no longer offset by the length of co_varnames.

COPY_FREE_VARS(n)

Copies the n free variables from the closure into the frame. Removes the need for special code on the caller’s side when calling closures.

Nuevo en la versión 3.11.

RAISE_VARARGS(argc)

Provoca una excepción utilizando una de las 3 formas de la declaración raise, dependiendo del valor de argc:

  • 0: raise (vuelve a lanzar la excepción anterior)

  • 1: raise TOS (lanza instancia de excepción o un tipo en TOS)

  • 2: raise TOS1 desde TOS (lanza una instancia de excepción o tipo en TOS1 con __cause__ establecida en `` TOS``)

CALL(argc)

Calls a callable object with the number of arguments specified by argc, including the named arguments specified by the preceding KW_NAMES, if any. On the stack are (in ascending order), either:

  • NULL

  • The callable

  • The positional arguments

  • The named arguments

or:

  • The callable

  • self

  • The remaining positional arguments

  • The named arguments

argc is the total of the positional and named arguments, excluding self when a NULL is not present.

CALL pops all arguments and the callable object off the stack, calls the callable object with those arguments, and pushes the return value returned by the callable object.

Nuevo en la versión 3.11.

CALL_FUNCTION_EX(flags)

Llama a un objeto invocable con un conjunto variable de argumentos posicionales y de palabras clave. Si se establece el bit más bajo de flags, la parte superior de la pila contiene un objeto de mapeo que contiene argumentos de palabras clave adicionales. Antes de que se llame al invocable, el objeto de mapeo y el objeto iterable se «desempaquetan» y su contenido se pasa como palabra clave y argumentos posicionales, respectivamente. CALL_FUNCTION_EX saca todos los argumentos y el objeto invocable de la pila, llama al objeto invocable con esos argumentos y empuja el valor de retorno devuelto por el objeto invocable.

Nuevo en la versión 3.6.

PUSH_NULL

Pushes a NULL to the stack. Used in the call sequence to match the NULL pushed by LOAD_METHOD for non-method calls.

Nuevo en la versión 3.11.

KW_NAMES(i)

Prefixes CALL. Stores a reference to co_consts[consti] into an internal variable for use by CALL. co_consts[consti] must be a tuple of strings.

Nuevo en la versión 3.11.

MAKE_FUNCTION(flags)

Apila un nuevo objeto de función en la pila. De abajo hacia arriba, la pila consumida debe constar de valores si el argumento lleva un valor de marca especificado

  • 0x01, una tupla de valores predeterminados para solo parámetros posicionales y posicionales o de palabras clave en orden posicional

  • 0x02 un diccionario de valores predeterminados de solo palabras clave

  • 0x04 una tupla de cadenas de caracteres que contiene anotaciones de parámetros

  • 0x08 una tupla que contiene celdas para variables libres, haciendo un cierre (closure)

  • el código asociado con la función (en TOS1)

  • el nombre calificado de la función (en TOS)

Distinto en la versión 3.10: El valor indicador 0x04 es una tupla de cadena de caracteres en vez de un diccionario

BUILD_SLICE(argc)

Apila un objeto de rebanada en la pila. argc debe ser 2 o 3. Si es 2, se apila slice(TOS1, TOS); si es 3, se apila slice(TOS2, TOS1, TOS). Consulte la función incorporada slice() para obtener más información.

EXTENDED_ARG(ext)

Prefija cualquier código de operación que tenga un argumento demasiado grande para caber en el byte predeterminado. ext contiene un byte adicional que actúa como bits más altos en el argumento. Para cada opcode, como máximo se permiten tres prefijos EXTENDED_ARG, formando un argumento de dos bytes a cuatro bytes.

FORMAT_VALUE(flags)

Se utiliza para implementar cadenas literales formateadas (cadenas de caracteres f). Desapila un fmt_spec opcional de la pila, luego un value requerido. flags se interpreta de la siguiente manera:

  • (flags & 0x03) == 0x00: value es formateado como está.

  • (flags & 0x03) == 0x01: llama str() sobre value antes de formatearlo.

  • (flags & 0x03) == 0x02: llama repr() sobre value antes de formatearlo.

  • (flags & 0x03) == 0x03: llama ascii() sobre value antes de formatearlo.

  • (flags & 0x04) == 0x04: desapila fmt_spec de la pila y lo usa, de lo contrario usa un fmt_spec vacío.

El formateo se realiza usando PyObject_Format(). El resultado se apila en la pila.

Nuevo en la versión 3.6.

MATCH_CLASS(count)

TOS es una tupla de nombres de atributos clave, TOS1 es la clase contra la cual se hace la coincidencia, y TOS2 es el sujeto de la coincidencia. count es el número de sub-patrones posicionales.

Pop TOS, TOS1, and TOS2. If TOS2 is an instance of TOS1 and has the positional and keyword attributes required by count and TOS, push a tuple of extracted attributes. Otherwise, push None.

Nuevo en la versión 3.10.

Distinto en la versión 3.11: Previously, this instruction also pushed a boolean value indicating success (True) or failure (False).

RESUME(where)

A no-op. Performs internal tracing, debugging and optimization checks.

The where operand marks where the RESUME occurs:

  • 0 The start of a function

  • 1 After a yield expression

  • 2 After a yield from expression

  • 3 After an await expression

Nuevo en la versión 3.11.

RETURN_GENERATOR

Create a generator, coroutine, or async generator from the current frame. Clear the current frame and return the newly created generator.

Nuevo en la versión 3.11.

SEND(delta)

Equivalent to TOS = TOS1.send(TOS). Used in yield from and await statements.

If the call raises StopIteration, pop both items, push the exception’s value attribute, and increment the bytecode counter by delta.

Nuevo en la versión 3.11.

ASYNC_GEN_WRAP

Wraps the value on top of the stack in an async_generator_wrapped_value. Used to yield in async generators.

Nuevo en la versión 3.11.

HAVE_ARGUMENT

This is not really an opcode. It identifies the dividing line between opcodes in the range [0,255] which don’t use their argument and those that do (< HAVE_ARGUMENT and >= HAVE_ARGUMENT, respectively).

If your application uses pseudo instructions, use the hasarg collection instead.

Distinto en la versión 3.6: Ahora cada instrucción tiene un argumento, pero los códigos de operación <HAVE_ARGUMENT la ignoran. Antes, solo los códigos de operación > = HAVE_ARGUMENT tenían un argumento.

Distinto en la versión 3.12: Pseudo instructions were added to the dis module, and for them it is not true that comparison with HAVE_ARGUMENT indicates whether they use their arg.

Pseudo-instructions

These opcodes do not appear in python bytecode, they are used by the compiler but are replaced by real opcodes or removed before bytecode is generated.

SETUP_FINALLY(target)

Set up an exception handler for the following code block. If an exception occurs, the value stack level is restored to its current state and control is transferred to the exception handler at target.

SETUP_CLEANUP(target)

Like SETUP_FINALLY, but in case of exception also pushes the last instruction (lasti) to the stack so that RERAISE can restore it. If an exception occurs, the value stack level and the last instruction on the frame are restored to their current state, and control is transferred to the exception handler at target.

SETUP_WITH(target)

Like SETUP_CLEANUP, but in case of exception one more item is popped from the stack before control is transferred to the exception handler at target.

This variant is used in with and async with constructs, which push the return value of the context manager’s __enter__() or __aenter__() to the stack.

POP_BLOCK

Marks the end of the code block associated with the last SETUP_FINALLY, SETUP_CLEANUP or SETUP_WITH.

JUMP
JUMP_NO_INTERRUPT

Undirected relative jump instructions which are replaced by their directed (forward/backward) counterparts by the assembler.

LOAD_METHOD

Optimized unbound method lookup. Emitted as a LOAD_ATTR opcode with a flag set in the arg.

Colecciones opcode

Estas colecciones se proporcionan para la introspección automática de instrucciones de bytecode:

Distinto en la versión 3.12: The collections now contain pseudo instructions as well. These are opcodes with values >= MIN_PSEUDO_OPCODE.

dis.opname

Secuencia de nombres de operaciones, indexable utilizando el bytecode.

dis.opmap

Nombres de operaciones de mapeo de diccionario a bytecodes.

dis.cmp_op

Secuencia de todos los nombres de operaciones de comparación.

dis.hasarg

Sequence of bytecodes that use their argument.

Nuevo en la versión 3.12.

dis.hasconst

Secuencia de bytecodes que acceden a una constante.

dis.hasfree

Secuencia de bytecodes que acceden a una variable libre (tenga en cuenta que “libre” en este contexto se refiere a nombres en el alcance actual a los que hacen referencia los ámbitos internos o los nombres en los ámbitos externos a los que se hace referencia desde este ámbito. No incluye referencias a ámbitos globales o integrados).

dis.hasname

Secuencia de bytecodes que acceden a un atributo por nombre.

dis.hasjrel

Secuencia de bytecodes que tienen un objetivo de salto relativo.

dis.hasjabs

Secuencia de bytecodes que tienen un objetivo de salto absoluto.

dis.haslocal

Secuencia de códigos de bytes que acceden a una variable local.

dis.hascompare

Secuencia de bytecodes de operaciones booleanas.

dis.hasexc

Sequence of bytecodes that set an exception handler.

Nuevo en la versión 3.12.