Документация 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 байта. Ранее количество байт зависело от инструкции.

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

Изменено в версии 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.

Инструкции байткода 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

Реализует 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). Используется для реализации множественных включений (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. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.

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)

Этот опкод выполняет несколько операций перед началом блока with. Сначала он загружает __exit__() из контекстного менеджера и помещает его в стек для последующего использования WITH_CLEANUP_START. Затем вызывается __enter__(), и помещается блок finally, указывающий на 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. SECOND – это None или тип исключения (помещён, когда было возбуждено исключение).

Извлекает два значения из стека. Если SECOND не None и TOS истинно, разворачивает блок 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, снимает 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 истинно, устанавливает счётчик байткода в target. TOS извлекается из стека.

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

POP_JUMP_IF_FALSE(target)

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

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

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.

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)

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

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

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

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

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

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

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

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

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

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