dis — Дизассемблер для байткода Python

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


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

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

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

Пример: Дана функция 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» - это номер строки).

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

Добавлено в версии 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 из данного трассировочного отката, установив current_offset на инструкцию, ответственную за исключение.

codeobj

Объект скомпилированного кода.

first_line

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

dis()

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

info()

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

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

Пример:

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

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

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

dis.code_info(x)

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

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

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

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

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: Теперь он может работать с объектами coroutine и асинхронными генераторами.

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

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

Разборка записывается в виде текста в указанный аргумент 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: Метод PEP 626 co_lines используется вместо атрибутов co_firstlineno и co_lnotab объекта кода.

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: Добавлен параметр прыжок.

Инструкции байткода Python

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

class dis.Instruction

Детали для операции байткода

opcode

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

opname

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

arg

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

argval

разрешенное значение arg (если известно), в противном случае то же, что и 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 является объектом generator iterator или coroutine, то он оставляется как есть. В противном случае реализуется 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.

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

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

INPLACE_POWER

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

INPLACE_MULTIPLY

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

INPLACE_MATRIX_MULTIPLY

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

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

INPLACE_FLOOR_DIVIDE

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

INPLACE_TRUE_DIVIDE

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

INPLACE_MODULO

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

INPLACE_ADD

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

INPLACE_SUBTRACT

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

INPLACE_LSHIFT

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

INPLACE_RSHIFT

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

INPLACE_AND

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

INPLACE_XOR

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

INPLACE_OR

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

STORE_SUBSCR

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

DELETE_SUBSCR

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

Опкоды корутин.

GET_AWAITABLE

Реализует TOS = get_awaitable(TOS), где get_awaitable(o) возвращает o, если o является объектом coroutine или объектом генератора с флагом 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). Используется для реализации понимания множеств.

LIST_APPEND(i)

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

MAP_ADD(i)

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

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

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

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

RETURN_VALUE

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

YIELD_VALUE

Разворачивает TOS и возвращает его из generator.

YIELD_FROM

Вызывает TOS и передается ему как субитератор от generator.

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

SETUP_ANNOTATIONS

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

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

IMPORT_STAR

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

POP_BLOCK

Удаляет один блок из стека блоков. В каждом кадре есть стек блоков, обозначающих утверждения try и тому подобное.

POP_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 (или, более технически: если в его :c:const:`Py_TPFLAGS_MAPPING` установлен флаг :member:`~PyTypeObject.tp_flags`), вставьте True в стек. В противном случае, поместите False.

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

MATCH_SEQUENCE

Если TOS является экземпляром collections.abc.Sequence и не является экземпляром str/bytes/bytearray (или, более технически: если в его :c:const:`Py_TPFLAGS_SEQUENCE` установлен флаг :member:`~PyTypeObject.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: Словарь создается из элементов стека вместо того, чтобы создавать пустой словарь, заранее рассчитанный на количество элементов.

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__(). Объект модуля заталкивается в стек. Текущее пространство имен не затрагивается: для правильного оператора импорта последующая инструкция STORE_FAST изменяет пространство имен.

IMPORT_FROM(namei)

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

JUMP_FORWARD(delta)

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

POP_JUMP_IF_TRUE(target)

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

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

POP_JUMP_IF_FALSE(target)

Если TOS равен false, устанавливает счетчик байткода в цель. TOS выводится.

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

JUMP_IF_NOT_EXC_MATCH(target)

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

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

JUMP_IF_TRUE_OR_POP(target)

Если TOS истинно, устанавливает счетчик байткода в цель и оставляет TOS в стеке. В противном случае (TOS ложен), TOS выгружается.

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

JUMP_IF_FALSE_OR_POP(target)

Если TOS ложен, устанавливает счетчик байткода в цель и оставляет TOS в стеке. В противном случае (TOS истинно), TOS выгружается.

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

JUMP_ABSOLUTE(target)

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

FOR_ITER(delta)

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

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, но сначала проверяет словарь locals перед обращением к ячейке. Это используется для загрузки свободных переменных в телах классов.

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

STORE_DEREF(i)

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

DELETE_DEREF(i)

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

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

RAISE_VARARGS(argc)

Вызывает исключение, используя одну из 3 форм оператора 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 установлен, то в верхней части стека находится объект отображения, содержащий дополнительные аргументы в виде ключевых слов. Перед вызовом вызываемого объекта объект отображения и объект iterable «распаковываются», а их содержимое передается в качестве ключевых и позиционных аргументов соответственно. 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)

  • qualified name функции (в 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-строк). Загружает из стека необязательный fmt_spec, затем требуемое значение. флаги интерпретируются следующим образом:

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

  • (flags & 0x03) == 0x01: вызовите str() на значении перед его форматированием.

  • (flags & 0x03) == 0x02: вызовите repr() на значении перед его форматированием.

  • (flags & 0x03) == 0x03: вызовите ascii() на значении перед его форматированием.

  • (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 соответствует типу генератора или coroutine. Легальными типами являются 0 для генератора, 1 для coroutine и 2 для async-генератора.

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

ROT_N(count)

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

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

HAVE_ARGUMENT

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

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

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

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

dis.opname

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

dis.opmap

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

dis.cmp_op

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

dis.hasconst

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

dis.hasfree

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

dis.hasname

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

dis.hasjrel

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

dis.hasjabs

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

dis.haslocal

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

dis.hascompare

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

Вернуться на верх