Документация Python неофициальный перевод
Содержание страницы

dis – Дизассемблер байт-кода Pythondis – Disassembler for Python bytecode

Исходный код: Lib/dis.py


Модуль dis поддерживает анализ байт-кода CPython путём eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход, определён в файле Include/opcode.h и используется компилятором и интерпретатором.

Особенность реализации CPython: Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.

Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байт зависело от инструкции.

Изменено в версии 3.10: Аргументом инструкций перехода, обработки исключений и циклов теперь является смещение инструкции, а не смещение байта.

Пример: Дана функция myfunc():

def myfunc(alist):
    return len(alist)

следующую команду можно использовать для отображения дизассемблирования myfunc():

>>> dis.dis(myfunc)
  2           0 LOAD_GLOBAL              0 (len)
              2 LOAD_FAST                0 (alist)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE

(«2» – это номер строки).

Анализ байт-кодаBytecode analysis

Новое в версии 3.4.

API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект Bytecode, который предоставляет удобный доступ к деталям скомпилированного кода.

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

Анализирует байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращается compile()).

Это удобная обёртка над многими функциями, перечисленными ниже, особенно get_instructions(), поскольку итерация по экземпляру Bytecode возвращает операции байткода в виде экземпляров Instruction.

Если first_line не равен None, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.

Если current_offset не равно None, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, что dis() будет отображать маркер «текущая инструкция» напротив указанной операции.

classmethod from_traceback(tb)

Создаёт экземпляр Bytecode из заданного traceback, устанавливая current_offset на инструкцию, ответственную за исключение.

codeobj

Скомпилированный объект кода.

first_line

Первая строка исходного кода объекта кода (если доступна)

dis()

Возвращает форматированное представление операций байткода (то же, что выводится dis.dis(), но возвращается в виде многострочной строки).

info()

Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как code_info().

Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.

Пример:

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

Функции анализаAnalysis functions

Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:

dis.code_info(x)

Возвращает форматированную многострочную строку с подробной информацией об объекте кода для указанной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.

Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.

Новое в версии 3.2.

Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.

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

Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в file (или sys.stdout, если file не указан).

Это удобная краткая форма для print(code_info(x), file=file), предназначенная для интерактивного исследования в приглашении интерпретатора.

Новое в версии 3.2.

Изменено в версии 3.4: Добавлен параметр file.

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

Дизассемблирует объект x. x может быть модулем, классом, методом, функцией, генератором, асинхронным генератором, корутиной, объектом кода, строкой исходного кода или последовательностью байт сырого байт-кода. Для модуля дизассемблируются все функции. Для класса – все методы (включая методы класса и статические методы). Для объекта кода или последовательности сырого байт-кода выводится по одной строке на каждую инструкцию байт-кода. Также рекурсивно дизассемблируются вложенные объекты кода (код включений, генераторных выражений и вложенных функций, а также код, используемый для построения вложенных классов). Строки сначала компилируются в объекты кода с помощью встроенной функции compile(), а затем дизассемблируются. Если объект не указан, эта функция дизассемблирует последнюю трассировку.

Результат дисассемблирования выводится в виде текста в указанный аргумент file, если он передан, иначе – в sys.stdout.

Максимальная глубина рекурсии ограничивается параметром depth, если только он не равен None. depth=0 означает отсутствие рекурсии.

Изменено в версии 3.4: Добавлен параметр file.

Изменено в версии 3.7: Реализовано рекурсивное дисассемблирование и добавлен параметр depth.

Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.

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

Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.

Результат дисассемблирования выводится в виде текста в указанный аргумент file, если он передан, иначе – в sys.stdout.

Изменено в версии 3.4: Добавлен параметр file.

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

Дисассемблирует объект кода, указывая последнюю инструкцию, если передан lasti. Результат разбит на следующие столбцы:

  1. номер строки для первой инструкции каждой строки

  2. текущая инструкция, помечена как -->,

  3. инструкция с меткой, помечена >>,

  4. адрес инструкции,

  5. название кода операции,

  6. параметры операции и

  7. интерпретация параметров в скобках.

Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.

Результат дисассемблирования выводится в виде текста в указанный аргумент file, если он передан, иначе – в sys.stdout.

Изменено в версии 3.4: Добавлен параметр file.

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

Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.

Итератор генерирует последовательность именованных кортежей Instruction, содержащих сведения о каждой операции в переданном коде.

Если first_line не равен None, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.

Новое в версии 3.4.

dis.findlinestarts(code)

Эта функция-генератор использует метод co_lines объекта кода code для поиска смещений, соответствующих началам строк в исходном коде. Они генерируются в виде пар (offset, lineno).

Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.

Изменено в версии 3.10: Вместо атрибутов co_firstlineno и co_lnotab объекта кода используется метод PEP 626 co_lines.

dis.findlabels(code)

Обнаруживает все смещения в сырой скомпилированной строке байткода code, которые являются целями переходов, и возвращает список этих смещений.

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

Вычисляет эффект стека для opcode с аргументом oparg.

Если код имеет цель перехода и jump равен True, stack_effect() возвращает эффект стека при переходе. Если jump равен False, возвращается эффект стека при отсутствии перехода. А если jump равен None (по умолчанию), возвращается максимальный эффект стека для обоих случаев.

Новое в версии 3.4.

Изменено в версии 3.8: Добавлен параметр jump.

Инструкции байткода PythonPython Bytecode Instructions

Функция get_instructions() и класс Bytecode предоставляют сведения об инструкциях байткода в виде экземпляров Instruction:

class dis.Instruction

Подробности об операции байткода

opcode

Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в коллекциях Opcode.

opname

Человекочитаемое имя операции

arg

числовой аргумент операции (если есть), иначе None

argval

разрешённое значение аргумента (если известно), иначе то же, что и arg

argrepr

человекочитаемое описание аргумента операции

offset

начальный индекс операции в последовательности байт-кода

starts_line

Строка, с которой начинается данный опкод (если есть), иначе None.

is_jump_target

True, если другой код переходит сюда, иначе False

Новое в версии 3.4.

В настоящее время компилятор Python генерирует следующие инструкции байткода.

Общие инструкции

NOP

Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.

POP_TOP

Удаляет элемент с вершины стека (TOS).

ROT_TWO

Меняет местами два верхних элемента стека.

ROT_THREE

Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.

ROT_FOUR

Поднимает второй, третий и четвёртый элементы стека на одну позицию вверх, перемещает верхний вниз на четвёртую позицию.

Новое в версии 3.8.

DUP_TOP

Дублирует ссылку на вершине стека.

Новое в версии 3.2.

DUP_TOP_TWO

Дублирует две ссылки на вершине стека, сохраняя их порядок.

Новое в версии 3.2.

Унарные операции

Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.

UNARY_POSITIVE

Реализует TOS = +TOS.

UNARY_NEGATIVE

Реализует TOS = -TOS.

UNARY_NOT

Реализует TOS = not TOS.

UNARY_INVERT

Реализует TOS = ~TOS.

GET_ITER

Реализует TOS = iter(TOS).

GET_YIELD_FROM_ITER

Если TOS является объектом генераторный итератор или корутина, он остаётся без изменений. В противном случае реализует TOS = iter(TOS).

Новое в версии 3.5.

Бинарные операции

Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.

BINARY_POWER

Реализует TOS = TOS1 ** TOS.

BINARY_MULTIPLY

Реализует TOS = TOS1 * TOS.

BINARY_MATRIX_MULTIPLY

Реализует TOS = TOS1 @ TOS.

Новое в версии 3.5.

BINARY_FLOOR_DIVIDE

Реализует TOS = TOS1 // TOS.

BINARY_TRUE_DIVIDE

Реализует TOS = TOS1 / TOS.

BINARY_MODULO

Реализует TOS = TOS1 % TOS.

BINARY_ADD

Реализует TOS = TOS1 + TOS.

BINARY_SUBTRACT

Реализует TOS = TOS1 - TOS.

BINARY_SUBSCR

Реализует TOS = TOS1[TOS].

BINARY_LSHIFT

Реализует TOS = TOS1 << TOS.

BINARY_RSHIFT

Реализует TOS = TOS1 >> TOS.

BINARY_AND

Реализует TOS = TOS1 & TOS.

BINARY_XOR

Реализует TOS = TOS1 ^ TOS.

BINARY_OR

Реализует TOS = TOS1 | TOS.

Операции на месте

Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.

INPLACE_POWER

Реализует операцию на месте TOS = TOS1 ** TOS.

INPLACE_MULTIPLY

Реализует операцию на месте TOS = TOS1 * TOS.

INPLACE_MATRIX_MULTIPLY

Реализует операцию на месте TOS = TOS1 @ TOS.

Новое в версии 3.5.

INPLACE_FLOOR_DIVIDE

Реализует операцию на месте TOS = TOS1 // TOS.

INPLACE_TRUE_DIVIDE

Реализует операцию на месте TOS = TOS1 / TOS.

INPLACE_MODULO

Реализует операцию на месте TOS = TOS1 % TOS.

INPLACE_ADD

Реализует операцию на месте TOS = TOS1 + TOS.

INPLACE_SUBTRACT

Реализует операцию на месте TOS = TOS1 - TOS.

INPLACE_LSHIFT

Реализует операцию на месте TOS = TOS1 << TOS.

INPLACE_RSHIFT

Реализует операцию на месте TOS = TOS1 >> TOS.

INPLACE_AND

Реализует операцию на месте TOS = TOS1 & TOS.

INPLACE_XOR

Реализует операцию на месте TOS = TOS1 ^ TOS.

INPLACE_OR

Реализует операцию на месте TOS = TOS1 | TOS.

STORE_SUBSCR

Реализует TOS1[TOS] = TOS2.

DELETE_SUBSCR

Реализует del TOS1[TOS].

Коды операций корутин

GET_AWAITABLE

Реализует TOS = get_awaitable(TOS), где get_awaitable(o) возвращает o, если o является объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешает o.__await__.

Новое в версии 3.5.

GET_AITER

Реализует TOS = TOS.__aiter__().

Новое в версии 3.5.

Изменено в версии 3.7: Возврат ожидаемых объектов из __aiter__ больше не поддерживается.

GET_ANEXT

Помещает get_awaitable(TOS.__anext__()) в стек. См. GET_AWAITABLE для подробностей о get_awaitable.

Новое в версии 3.5.

END_ASYNC_FOR

Завершает цикл async for. Обрабатывает исключение, возникшее при ожидании следующего элемента. Если TOS равно StopAsyncIteration, извлекает 7 значений из стека и восстанавливает состояние исключения, используя вторые три из них. В противном случае повторно возбуждает исключение, используя три значения из стека. Блок обработчика исключения удаляется из стека блоков.

Новое в версии 3.8.

BEFORE_ASYNC_WITH

Извлекает __aenter__ и __aexit__ из объекта на вершине стека. Помещает __aexit__ и результат __aenter__() в стек.

Новое в версии 3.5.

SETUP_ASYNC_WITH

Создаёт новый объект фрейма.

Новое в версии 3.5.

Прочие опкоды

PRINT_EXPR

Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью POP_TOP.

SET_ADD(i)

Вызывает set.add(TOS1[-i], TOS). Используется для реализации множественных включений (set comprehensions).

LIST_APPEND(i)

Вызывает list.append(TOS1[-i], TOS). Используется для реализации списковых включений (list comprehensions).

MAP_ADD(i)

Вызывает dict.__setitem__(TOS1[-i], TOS1, TOS). Используется для реализации словарных включений (dict comprehensions).

Новое в версии 3.1.

Изменено в версии 3.8: Значением отображения теперь является TOS, а ключом – TOS1. Ранее они были переставлены.

Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.

RETURN_VALUE

Возвращает TOS вызывающей стороне функции.

YIELD_VALUE

Извлекает TOS и возвращает его из генератора.

YIELD_FROM

Извлекает TOS и делегирует ему как под-итератор от генератора.

Новое в версии 3.3.

SETUP_ANNOTATIONS

Проверяет, определён ли __annotations__ в locals(); если нет, он устанавливается в пустой dict. Этот опкод генерируется, только если тело класса или модуля статически содержит аннотации переменных.

Новое в версии 3.6.

IMPORT_STAR

Загружает все имена, не начинающиеся с '_', из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализует from module import *.

POP_BLOCK

Удаляет один блок из стека блоков. Для каждого фрейма существует стек блоков, обозначающий операторы try и тому подобное.

POP_EXCEPT

Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключения, неявно создаваемым при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.

RERAISE

Повторно возбуждает исключение, находящееся на вершине стека. Если oparg не равен нулю, восстанавливает f_lasti текущего фрейма до значения, которое было на момент возбуждения исключения.

Новое в версии 3.9.

WITH_EXCEPT_START

Вызывает функцию, находящуюся на позиции 7 в стеке, передавая ей три верхних элемента стека в качестве аргументов. Используется для реализации вызова context_manager.__exit__(*exc_info()), когда исключение возникло в операторе with.

Новое в версии 3.9.

LOAD_ASSERTION_ERROR

Помещает AssertionError в стек. Используется оператором assert.

Новое в версии 3.9.

LOAD_BUILD_CLASS

Помещает builtins.__build_class__() в стек. Позже он вызывается CALL_FUNCTION для создания класса.

SETUP_WITH(delta)

Этот опкод выполняет несколько операций перед началом блока with. Сначала он загружает __exit__() из контекстного менеджера и помещает его в стек для последующего использования WITH_EXCEPT_START. Затем вызывается __enter__(), и помещается блок finally, указывающий на delta. Наконец, результат вызова метода __enter__() помещается в стек. Следующий опкод либо игнорирует его (POP_TOP), либо сохраняет в переменную(ые) (STORE_FAST, STORE_NAME или UNPACK_SEQUENCE).

Новое в версии 3.2.

COPY_DICT_WITHOUT_KEYS

TOS – это кортеж ключей отображения, а TOS1 – это объект сопоставления. Заменить TOS на dict, сформированный из элементов TOS1, но без каких-либо ключей, присутствующих в TOS.

Новое в версии 3.10.

GET_LEN

Помещает len(TOS) в стек.

Новое в версии 3.10.

MATCH_MAPPING

Если TOS является экземпляром collections.abc.Mapping (или, более технически: если у него установлен флаг Py_TPFLAGS_MAPPING в tp_flags), помещает True в стек. В противном случае помещает False.

Новое в версии 3.10.

MATCH_SEQUENCE

Если TOS является экземпляром collections.abc.Sequence и не является экземпляром str/bytes/bytearray (или, более технически: если у него установлен флаг Py_TPFLAGS_SEQUENCE в его tp_flags), поместить True в стек. В противном случае поместить False.

Новое в версии 3.10.

MATCH_KEYS

TOS – это кортеж ключей отображения, а TOS1 – объект сопоставления. Если TOS1 содержит все ключи из TOS, поместить в стек tuple, содержащий соответствующие значения, а затем True. В противном случае поместить None, а затем False.

Новое в версии 3.10.

Все следующие опкоды используют свои аргументы.

STORE_NAME(namei)

Реализует name = TOS. namei – это индекс name в атрибуте co_names объекта кода. Компилятор пытается использовать STORE_FAST или STORE_GLOBAL, если это возможно.

DELETE_NAME(namei)

Реализует del name, где namei – это индекс в атрибут co_names объекта кода.

UNPACK_SEQUENCE(count)

Распаковывает TOS в count отдельных значений, которые помещаются в стек справа налево.

UNPACK_EX(counts)

Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.

Младший байт counts – это количество значений до спискового значения, а старший байт counts – количество значений после него. Результирующие значения помещаются в стек справа налево.

STORE_ATTR(namei)

Реализует TOS.name = TOS1, где namei – это индекс имени в co_names.

DELETE_ATTR(namei)

Реализует del TOS.name, используя namei как индекс в co_names.

STORE_GLOBAL(namei)

Работает как STORE_NAME, но сохраняет имя как глобальное.

DELETE_GLOBAL(namei)

Работает как DELETE_NAME, но удаляет глобальное имя.

LOAD_CONST(consti)

Помещает co_consts[consti] в стек.

LOAD_NAME(namei)

Помещает значение, связанное с co_names[namei], в стек.

BUILD_TUPLE(count)

Создаёт кортеж, потребляя count элементов из стека, и помещает полученный кортеж в стек.

BUILD_LIST(count)

Работает как BUILD_TUPLE, но создаёт список.

BUILD_SET(count)

Работает как BUILD_TUPLE, но создаёт множество.

BUILD_MAP(count)

Помещает новый объект словаря в стек. Извлекает 2 * count элементов так, чтобы словарь содержал count записей: {..., TOS3: TOS2, TOS1: TOS}.

Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для count элементов.

BUILD_CONST_KEY_MAP(count)

Версия BUILD_MAP, оптимизированная для константных ключей. Снимает верхний элемент стека, содержащий кортеж ключей, затем, начиная с TOS1, снимает count значений и формирует словарь.

Новое в версии 3.6.

BUILD_STRING(count)

Конкатенирует count строк из стека и помещает результирующую строку в стек.

Новое в версии 3.6.

LIST_TO_TUPLE

Извлекает список из стека и помещает кортеж, содержащий те же значения.

Новое в версии 3.9.

LIST_EXTEND(i)

Вызывает list.extend(TOS1[-i], TOS). Используется для построения списков.

Новое в версии 3.9.

SET_UPDATE(i)

Вызывает set.update(TOS1[-i], TOS). Используется для создания множеств.

Новое в версии 3.9.

DICT_UPDATE(i)

Вызывает dict.update(TOS1[-i], TOS). Используется для создания словарей.

Новое в версии 3.9.

DICT_MERGE

Как DICT_UPDATE, но вызывает исключение для повторяющихся ключей.

Новое в версии 3.9.

LOAD_ATTR(namei)

Заменяет TOS на getattr(TOS, co_names[namei]).

COMPARE_OP(opname)

Выполняет логическую операцию. Имя операции можно найти в cmp_op[opname].

IS_OP(invert)

Выполняет сравнение is или is not, если invert равно 1.

Новое в версии 3.9.

CONTAINS_OP(invert)

Выполняет сравнение in или not in, если invert равно 1.

Новое в версии 3.9.

IMPORT_NAME(namei)

Импортирует модуль co_names[namei]. TOS и TOS1 извлекаются и передаются в качестве аргументов fromlist и level для __import__(). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкция STORE_FAST изменяет пространство имён.

IMPORT_FROM(namei)

Загружает атрибут co_names[namei] из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией STORE_FAST.

JUMP_FORWARD(delta)

Увеличивает счётчик байт-кода на delta.

POP_JUMP_IF_TRUE(target)

Если TOS истинно, устанавливает счётчик байткода в target. TOS извлекается из стека.

Новое в версии 3.1.

POP_JUMP_IF_FALSE(target)

Если TOS ложно, устанавливает счётчик байткода в target. TOS извлекается из стека.

Новое в версии 3.1.

JUMP_IF_NOT_EXC_MATCH(target)

Проверяет, является ли второе значение в стеке исключением, совпадающим с TOS, и переходит, если это не так. Извлекает два значения из стека.

Новое в версии 3.9.

JUMP_IF_TRUE_OR_POP(target)

Если TOS истинно, устанавливает счётчик байткода в target и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.

Новое в версии 3.1.

JUMP_IF_FALSE_OR_POP(target)

Если TOS ложно, устанавливает счётчик байткода в target и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.

Новое в версии 3.1.

JUMP_ABSOLUTE(target)

Устанавливает счётчик байткода в target.

FOR_ITER(delta)

TOS является итератором. Вызвать его метод __next__(). Если это даёт новое значение, поместить его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, TOS удаляется из стека, а счётчик байт-кода увеличивается на delta.

LOAD_GLOBAL(namei)

Загружает глобальную переменную co_names[namei] в стек.

SETUP_FINALLY(delta)

Помещает блок try из предложения try-finally или try-except на стек блоков. delta указывает на блок finally или первый блок except.

LOAD_FAST(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек.

STORE_FAST(var_num)

Сохраняет TOS в локальную переменную co_varnames[var_num].

DELETE_FAST(var_num)

Удаляет локальную переменную co_varnames[var_num].

LOAD_CLOSURE(i)

Помещает ссылку на ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Имя переменной – co_cellvars[i], если i меньше длины co_cellvars. В противном случае – co_freevars[i - len(co_cellvars)].

LOAD_DEREF(i)

Загружает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.

LOAD_CLASSDEREF(i)

Похожа на LOAD_DEREF, но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.

Новое в версии 3.4.

STORE_DEREF(i)

Сохраняет TOS в ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных.

DELETE_DEREF(i)

Очищает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Используется оператором del.

Новое в версии 3.2.

RAISE_VARARGS(argc)

Вызывает исключение, используя одну из трёх форм оператора raise, в зависимости от значения argc:

  • 0: raise (повторный вызов предыдущего исключения)

  • 1: raise TOS (вызов экземпляра или типа исключения по адресу TOS)

  • 2: raise TOS1 from TOS (возбуждает экземпляр или тип исключения на TOS1 с __cause__ установленным в TOS)

CALL_FUNCTION(argc)

Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов. Вершина стека содержит позиционные аргументы, причём самый правый аргумент находится на вершине. Под аргументами находится вызываемый объект. CALL_FUNCTION извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, в стек.

Изменено в версии 3.6: Эта инструкция используется только для вызовов с позиционными аргументами.

CALL_FUNCTION_KW(argc)

Вызывает вызываемый объект с позиционными (если есть) и именованными аргументами. argc указывает общее количество позиционных и именованных аргументов. Верхний элемент стека содержит кортеж с именами именованных аргументов, которые должны быть строками. Под ним находятся значения именованных аргументов в порядке, соответствующем кортежу. Под ними находятся позиционные аргументы, причём самый правый параметр на вершине. Под аргументами находится вызываемый объект. CALL_FUNCTION_KW извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, в стек.

Изменено в версии 3.6: Именованные аргументы упаковываются в кортеж вместо словаря, argc указывает общее количество аргументов.

CALL_FUNCTION_EX(flags)

Вызывает вызываемый объект с набором позиционных и именованных аргументов переменной длины. Если установлен младший бит flags, на вершине стека находится отображающий объект (mapping), содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта отображающий объект и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно. CALL_FUNCTION_EX извлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.

Новое в версии 3.6.

LOAD_METHOD(namei)

Загружает метод с именем co_names[namei] из объекта TOS. TOS удаляется из стека. Этот байт-код различает два случая: если TOS имеет метод с правильным именем, он помещает в стек несвязанный метод и TOS. TOS будет использоваться как первый аргумент (self) в CALL_METHOD при вызове несвязанного метода. В противном случае помещаются NULL и объект, возвращённый поиском атрибута.

Добавлено в версии 3.7.

CALL_METHOD(argc)

Вызывает метод. argc – количество позиционных аргументов. Именованные аргументы не поддерживаются. Эта инструкция предназначена для использования с LOAD_METHOD. Позиционные аргументы находятся на вершине стека. Под ними находятся два элемента, описанные в LOAD_METHOD (либо self и несвязанный метод, либо NULL и произвольный вызываемый объект). Все они извлекаются, и возвращаемое значение помещается в стек.

Добавлено в версии 3.7.

MAKE_FUNCTION(flags)

Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанное значение флага.

  • 0x01 кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке

  • 0x02 словарь значений по умолчанию только-именованных параметров

  • 0x04 кортеж строк, содержащих аннотации параметров

  • 0x08 кортеж, содержащий ячейки для свободных переменных, образующий замыкание

  • код, связанный с функцией (на TOS1)

  • полное имя функции (на TOS)

Изменено в версии 3.10: Значение флага 0x04 теперь является кортежем строк вместо словаря

BUILD_SLICE(argc)

Помещает объект среза в стек. argc должен быть 2 или 3. Если равно 2, помещается slice(TOS1, TOS); если 3, помещается slice(TOS2, TOS1, TOS). Подробнее см. встроенную функцию slice().

EXTENDED_ARG(ext)

Является префиксом для любой операции, аргумент которой слишком велик, чтобы поместиться в один байт по умолчанию. ext содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждой операции допускается не более трёх префиксов EXTENDED_ARG, формирующих аргумент от двух до четырёх байт.

FORMAT_VALUE(flags)

Используется для реализации форматированных строковых литералов (f-строк). Извлекает из стека необязательную спецификацию формата, затем обязательное значение. Флаги интерпретируются следующим образом:

  • (flags & 0x03) == 0x00: значение форматируется как есть.

  • (flags & 0x03) == 0x01: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.

  • (flags & 0x03) == 0x02: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.

  • (flags & 0x03) == 0x03: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.

  • (flags & 0x04) == 0x04: извлечь fmt_spec из стека и использовать его, иначе использовать пустой fmt_spec.

Форматирование выполняется с помощью PyObject_Format(). Результат помещается в стек.

Новое в версии 3.6.

MATCH_CLASS(count)

TOS – это кортеж имен ключевых атрибутов, TOS1 – класс, с которым производится сопоставление, а TOS2 – объект сопоставления. count – количество позиционных подшаблонов.

Извлечь TOS. Если TOS2 является экземпляром TOS1 и имеет позиционные и именованные атрибуты, требуемые count и TOS, установить TOS в True, а TOS1 – в кортеж извлечённых атрибутов. В противном случае установить TOS в False.

Новое в версии 3.10.

GEN_START(kind)

Извлекает TOS. Операнд kind соответствует типу генератора или корутины. Допустимые значения: 0 для генератора, 1 для корутины и 2 для асинхронного генератора.

Новое в версии 3.10.

ROT_N(count)

Поднять первые count элементов стека на одну позицию вверх и переместить TOS вниз на позицию count.

Новое в версии 3.10.

HAVE_ARGUMENT

Это не совсем опкод. Он обозначает границу между опкодами, которые не используют свой аргумент, и теми, которые используют (соответственно < HAVE_ARGUMENT и >= HAVE_ARGUMENT).

Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды < HAVE_ARGUMENT игнорируют его. Раньше аргумент был только у опкодов >= HAVE_ARGUMENT.

Коллекции опкодовOpcode collections

Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:

dis.opname

Последовательность имён операций, индексируемая с помощью байткода.

dis.opmap

Словарь, сопоставляющий имена операций с байткодами.

dis.cmp_op

Последовательность всех имён операций сравнения.

dis.hasconst

Последовательность байткодов, обращающихся к константе.

dis.hasfree

Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она не включает ссылки на глобальные или встроенные области видимости).

dis.hasname

Последовательность байткодов, обращающихся к атрибуту по имени.

dis.hasjrel

Последовательность байткодов, имеющих относительную цель перехода.

dis.hasjabs

Последовательность байткодов, имеющих абсолютную цель перехода.

dis.haslocal

Последовательность байткодов, обращающихся к локальной переменной.

dis.hascompare

Последовательность байткодов логических операций.