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


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

Детали реализации CPython: Байткод является детализированной реализацией CPython интерпретатора. Нет гарантий, что байткод не будет добавлен, удален или изменен между версиями Python. Использование этого модуля не должно рассматриваться работой через Python VM или 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» - номер строки).

Анализ Bytecode

Добавлено в версии 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() покажет маркер «текущей команды» против указанного opcode.

classmethod from_traceback(tb)

Создать Bytecode сущность из данного трейсбэка, установив 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

Аналитические функции

Модуль 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)

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

Дизассемблирование записывается как текст поставляемому аргументу 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_firstlineno, и co_lnotab атрибуты объекта кода code, чтобы найти смещения, которые являются началом строк в исходном коде. Они генерируются как пары (offset, lineno). См. Objects/lnotab_notes.txt для формата co_lnotab и как его расшифровать.

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

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.

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

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

class dis.Instruction

Сведения об операциях с байт-кодом

opcode

Числовой код для операции, соответствуя упомянутому ниже opcode значениям и значениям байт-кода в Коллекции 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 является объектом генератор итератора или корутиной, он остается как есть. В противном случае реализует 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: Возвращение awaitable объектов из __aiter__ больше не поддерживается.

GET_ANEXT

Реализует PUSH(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 и возвращает его из генератора.

YIELD_FROM

Выталкивает TOS и его делегатов в качестве субитератора из генератора.

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

SETUP_ANNOTATIONS

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

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

IMPORT_STAR

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

POP_BLOCK

Удаляет один блок из стека блоков. На фрейм приходится стек блоков, обозначенных try инструкцией, и тому подобное.

POP_EXCEPT

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

POP_FINALLY(preserve_tos)

Очищает стек значений и стек блоков. Если preserve_tos не является 0 TOS сначала выталкивается из стека и вталкивается в стек после выполнения других операций на стеке:

  • Если TOS является NULL или целым числом (задаваемым BEGIN_FINALLY или CALL_FINALLY), он выталкивается из стека.
  • Если TOS является типом исключения (вталкивается, когда было вызвано исключение) 6 значений вытолкнуты из стека, последние три вытолкнутых значений используется для восстановления состояния исключения. Блок обработчика исключений удален из стека блоков.

Он похож на END_FINALLY, но не изменяет счетчик байт-кодов и не вызывает исключение. Используется для реализации break, continue и return в блоке finally.

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

BEGIN_FINALLY

Вталкивает NULL на стек для использования в END_FINALLY, POP_FINALLY, WITH_CLEANUP_START и WITH_CLEANUP_FINISH. Запуск блока finally.

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

END_FINALLY

Завершение finally клаузулы. Интерпретатор вспоминает, должно ли исключение быть повторно вызвано, или выполнение должно быть продолжено в зависимости от значения TOS.

  • Если TOS является NULL (вталкивается BEGIN_FINALLY), продолжает из следующей команды. Выталкивает TOS.
  • Если TOS является целым числом (вталкивается CALL_FINALLY), устанавливает счетчик байт-кодов в TOS. Выталкивает TOS.
  • Если TOS является типом исключения (вталкивается, когда было вызвано исключение) 6 значений выталкиваются из стека, первые три вытолкнутых значений используется для повторного вызова исключения, и используются последние три вытолкнутых значения чтобы восстановить состояние исключения. Блок обработчика исключений удаляется из стека блоков.
LOAD_BUILD_CLASS

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

SETUP_WITH(delta)

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

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

WITH_CLEANUP_START

Начало очистки стека при выходе из блока with инструкции.

В вершину стека вталкивается либо NULL (вталкивается BEGIN_FINALLY), либо 6 значений, если в блоке with возникло исключение. Ниже __exit__() менеджера контекст, или __aexit__() связанного метода.

Если TOS является NULL, вызывается SECOND(None, None, None), удаляет функцию из стека, оставляя TOS, и вталкивает None в стек. В противном случае вызывает SEVENTH(TOP, SECOND, THIRD), сдвигает вниз нижние 3 значения стека, заменяет пустое место на NULL и вталкивает TOS. Наконец, вталкивает результат вызова.

WITH_CLEANUP_FINISH

Завершает очистку стека при выходе блока оператора with.

TOS — результат __exit__() или вызова функции __aexit__(), вталкивает WITH_CLEANUP_START. ВТОРОЙ None или тип исключения (вталкивается, когда исключение было вызвано).

Выталкивает два значения из стека. Если ВТОРОЙ не None, и TOS True, раскручивает блок EXCEPT_HANDLER, который был создан, когда исключение было поймано и вталкивает NULL в стек.

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

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, pops count значения, чтобы сформировать значения в построенном словаре.

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

BUILD_STRING(count)

Конкатенация count строк из стека и вталкивание результирующей строки в стек.

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

BUILD_TUPLE_UNPACK(count)

Выталкивает count итераторов от стека, присоединяет к ним единственный кортеж и вталкивает результат. Реализует итерабельную распаковку в отображениях кортежей (*x, *y, *z).

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

BUILD_TUPLE_UNPACK_WITH_CALL(count)

Подобен BUILD_TUPLE_UNPACK, но используется для синтаксиса вызова f(*x, *y, *z). Элемент стека в позиции count + 1 должен соответствовать вызываемому объекту f.

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

BUILD_LIST_UNPACK(count)

Аналогичен BUILD_TUPLE_UNPACK, но вталкивает список вместо кортежа. Реализует распаковку на итерации в отображениях списка [*x, *y, *z].

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

BUILD_SET_UNPACK(count)

Подобен BUILD_TUPLE_UNPACK, но вталкивает множество вместо кортежа. Реализует распаковку на итерации в отображении множеств {*x, *y, *z}.

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

BUILD_MAP_UNPACK(count)

Выталкивает count отображений из стека, сливает их в единственный словарь и выталкивает результат. Реализует распаковку словаря в отображениях словаря {**x, **y, **z}.

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

BUILD_MAP_UNPACK_WITH_CALL(count)

Подобен BUILD_MAP_UNPACK, но используется для синтаксиса вызова f(**x, **y, **z). Элемент стека в позиции count + 2 должен соответствовать вызову f.

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

Изменено в версии 3.6: Позиция вызываемого объекта определяется добавлением 2 к аргументу опкода вместо его кодировки во втором байте аргумента.

LOAD_ATTR(namei)

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

COMPARE_OP(opname)

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

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 содержит значение true, задает для счетчика байт-кодов значение target. Выталкивает TOS.

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

POP_JUMP_IF_FALSE(target)

Если TOS содержит значение false, задает для счетчика байт-кодов значение target. Всплывает TOS.

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

JUMP_IF_TRUE_OR_POP(target)

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

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

JUMP_IF_FALSE_OR_POP(target)

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

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

JUMP_ABSOLUTE(target)

Установить счетчик байт-кодов равным target.

FOR_ITER(delta)

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

LOAD_GLOBAL(namei)

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

SETUP_FINALLY(delta)

Вталкивает блок try-finally или try-except клаузулу в стек блока. delta указывает на блок finally или первый except блок.

CALL_FINALLY(delta)

Вталкивает адрес следующей инструкции в стек, и увеличивает счетчик байт-кодов на delta. Используется для вызова блока finally в качестве «подпрограммы».

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

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)

Вызывает исключение, используя одну из 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, вершина стека содержит объект отображения, содержащий дополнительные ключевые аргументы. Ниже указан итерируемый объект, содержащий позиционные аргументы и вызываемый объект для вызова. Могут использоваться BUILD_MAP_UNPACK_WITH_CALL и BUILD_TUPLE_UNPACK_WITH_CALL для слияния нескольких объектов отображения и итерируемых, содержащего аргументы. Перед вызовом вызываемого объекта объект сопоставления и объект итерации распаковываются, а их содержимое передается в виде ключевых и позиционных аргументов соответственно. 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)
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 из стека, затем требуемое value. flags интерпретируется следующим образом:

  • (flags & 0x03) == 0x00: value отформатирован как есть.
  • (flags & 0x03) == 0x01: вызвать str() на value перед форматированием.
  • (flags & 0x03) == 0x02: вызвать repr() на value перед форматированием.
  • (flags & 0x03) == 0x03: вызвать ascii() на value перед форматированием.
  • (flags & 0x04) == 0x04: вытолкнуть fmt_spec из стека и использовать его, иначе используется пустой fmt_spec.

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

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

HAVE_ARGUMENT

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

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

Коллекции Opcode

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

dis.opname

Последовательность имен операций с возможностью индексирования с использованием байт-кода.

dis.opmap

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

dis.cmp_op

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

dis.hasconst

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

dis.hasfree

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

dis.hasname

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

dis.hasjrel

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

dis.hasjabs

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

dis.haslocal

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

dis.hascompare

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