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

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


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

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

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

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

Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими записями встроенного кэша, которые имеют вид инструкций CACHE. По умолчанию эти инструкции скрыты, но их можно отобразить, передав show_caches=True любой утилите dis. Кроме того, интерпретатор теперь адаптирует байт-код, чтобы адаптировать его к различным условиям выполнения. Адаптивный байт-код можно показать, передав adaptive=True.

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

def myfunc(alist):
    return len(alist)

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

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

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

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

Интерфейс командной строки

Модуль dis может быть вызван как скрипт из командной строки:

python -m dis [-h] [-C] [infile]

Принимаются следующие варианты:

-h, --help

Отобразите использование и выход.

-C, --show-caches

Показывать встроенные кэши.

Если указано значение infile, то его дизассемблированный код будет записан в стандартный вывод. В противном случае дизассемблирование выполняется на основе скомпилированного исходного кода, полученного из стандартного ввода.

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

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

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

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

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

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

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

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

Если значение show_caches равно True, dis(), то будут отображаться записи встроенного кэша, используемые интерпретатором для специализации байт-кода.

Если значение adaptive равно True, dis(), будет отображаться специализированный байт-код, который может отличаться от исходного байт-кода.

classmethod from_traceback(tb, *, show_caches=False)

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

codeobj

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

first_line

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

dis()

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

info()

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

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

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

Пример:

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

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

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

dis.code_info(x)

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

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

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

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

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

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

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

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

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

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

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

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

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

Если значение show_caches равно True, эта функция отобразит записи встроенного кэша, используемые интерпретатором для специализации байт-кода.

Если значение adaptive равно True, эта функция отобразит специализированный байт-код, который может отличаться от исходного байт-кода.

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

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

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

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

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

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

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

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

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

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

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

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

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

  3. обозначенная инструкция, обозначенная символом >>,

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

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

  6. рабочие параметры, и

  7. интерпретация параметров, указанных в круглых скобках.

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

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

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

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

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

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

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

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

Параметры show_caches и adaptive работают так же, как и в dis().

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

Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.

dis.findlinestarts(code)

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

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

Изменено в версии 3.10: Метод PEP 626 co_lines() используется вместо co_firstlineno и co_lnotab атрибутов code object.

dis.findlabels(code)

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

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

Вычислите стековый эффект кода операции с аргументом oparg.

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

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

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

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

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

class dis.Instruction

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

opcode

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

opname

удобочитаемое название операции

arg

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

argval

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

argrepr

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

offset

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

starts_line

строка, начинающаяся с этого кода операции (если таковой имеется), в противном случае None

is_jump_target

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

positions

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

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

Изменено в версии 3.11: Добавлено поле positions.

class dis.Positions

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

lineno
end_lineno
col_offset
end_col_offset

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

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

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

NOP

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

POP_TOP

Удаляет элемент верхнего уровня (TOS).

COPY(i)

Переместите i-й элемент на вершину стопки. Элемент не будет удален со своего первоначального места.

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

SWAP(i)

Поменяйте местами TOS с товаром в позиции i.

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

CACHE

Вместо того, чтобы быть настоящей инструкцией, этот код операции используется для выделения дополнительного пространства, позволяющего интерпретатору кэшировать полезные данные непосредственно в самом байт-коде. Он автоматически скрывается всеми утилитами dis, но может быть просмотрен с помощью show_caches=True.

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

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

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

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

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

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) и второй самый верхний элемент стека (TO S1). Они выполняют операцию и помещают результат обратно в стек.

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

BINARY_OP(op)

Реализует бинарные операторы и операторы на месте (в зависимости от значения op).

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

BINARY_SUBSCR

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

STORE_SUBSCR

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

DELETE_SUBSCR

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

Коды операций сопрограммы

GET_AWAITABLE(where)

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

Если операнд where отличен от нуля, это указывает, где выполняется команда:

  • 1 После вызова __aenter__

  • 2 После вызова __aexit__

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

Изменено в версии 3.11: Ранее в этой инструкции не было oparg.

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. Обрабатывает исключение, возникающее при ожидании следующего элемента. Стек содержит асинхронную итерацию в S1 и вызванное исключение в НИХ. Оба они извлекаются. Если исключение не StopAsyncIteration, оно вызывается повторно.

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

Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не из трех элементов.

BEFORE_ASYNC_WITH

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

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

Различные коды операций

PRINT_EXPR

Реализует оператор expression для интерактивного режима. TOS извлекается из стека и печатается. В неинтерактивном режиме оператор expression завершается с помощью 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). Используется для реализации понимания dict.

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

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

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

RETURN_VALUE

Возвращает значение TOS вызывающему объекту функции.

YIELD_VALUE

Открывает TOS и возвращает его из generator.

SETUP_ANNOTATIONS

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

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

IMPORT_STAR

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

POP_EXCEPT

Извлекает значение из стека, которое используется для восстановления состояния исключения.

Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не из трех элементов.

RERAISE

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

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

Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не из трех элементов.

PUSH_EXC_INFO

Извлекает значение из стека. Перемещает текущее исключение на вершину стека. Возвращает значение, которое было первоначально извлечено, обратно в стек. Используется в обработчиках исключений.

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

CHECK_EXC_MATCH

Выполняет сопоставление исключений для except. Проверяет, является ли TOS 1 исключением, соответствующим TOS. Открывает TOS и выводит логический результат теста.

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

CHECK_EG_MATCH

Выполняет сопоставление исключений для except*. Применяет split(TOS) к группе исключений, представляющей ЭТИ 1.

В случае совпадения извлекает два элемента из стека и помещает неподходящую подгруппу (None в случае полного совпадения), за которой следует соответствующая подгруппа. Если совпадений нет, выберите один элемент (тип совпадения) и нажмите None.

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

PREP_RERAISE_STAR

Объединяет список созданных и повторно запущенных исключений из TOS в группу исключений для распространения из блока try-except*. Использует исходную группу исключений из TOS1 для восстановления структуры повторно запущенных исключений. Извлекает два элемента из стека и отправляет исключение на повторный вызов или None, если такового нет.

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

WITH_EXCEPT_START

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

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

Изменено в версии 3.11: Функция __exit__ находится в позиции 4 стека, а не в позиции 7. Представление исключений в стеке теперь состоит из одного, а не из трех элементов.

LOAD_ASSERTION_ERROR

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

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

LOAD_BUILD_CLASS

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

BEFORE_WITH(delta)

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

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

GET_LEN

Поместите len(TOS) в стопку.

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

MATCH_MAPPING

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

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

MATCH_SEQUENCE

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

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

MATCH_KEYS

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

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

Изменено в версии 3.11: Ранее эта инструкция также вводила логическое значение, указывающее на успех (True) или неудачу (False).

STORE_NAME(namei)

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

DELETE_NAME(namei)

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

UNPACK_SEQUENCE(count)

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

UNPACK_EX(counts)

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

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

STORE_ATTR(namei)

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

DELETE_ATTR(namei)

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

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 таким образом, чтобы в словаре было количество записей: {..., TOS3: TOS2, TOS1: TOS}.

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

BUILD_CONST_KEY_MAP(count)

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

Добавлено в версии 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(i)

Как 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]. Выводятся TOOLS и TOS1, которые предоставляют аргументы fromlist и level для __import__(). Объект модуля помещается в стек. Текущее пространство имен не затрагивается: для правильной инструкции import последующая инструкция STORE_FAST изменяет пространство имен.

IMPORT_FROM(namei)

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

JUMP_FORWARD(delta)

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

JUMP_BACKWARD(delta)

Уменьшает счетчик байт-кода на дельта. Проверяет наличие прерываний.

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

JUMP_BACKWARD_NO_INTERRUPT(delta)

Уменьшает счетчик байт-кода на дельта. Не проверяет наличие прерываний.

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

POP_JUMP_FORWARD_IF_TRUE(delta)

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

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

POP_JUMP_BACKWARD_IF_TRUE(delta)

Если значение TOS равно true, счетчик байт-кода уменьшается на дельта. Выдается значение TOS.

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

POP_JUMP_FORWARD_IF_FALSE(delta)

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

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

POP_JUMP_BACKWARD_IF_FALSE(delta)

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

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

POP_JUMP_FORWARD_IF_NOT_NONE(delta)

Если значение TOS не равно None, счетчик байт-кода увеличивается на дельта. Выдается значение TOS.

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

POP_JUMP_BACKWARD_IF_NOT_NONE(delta)

Если значение TOS не равно None, счетчик байт-кода уменьшается на дельта. Выдается значение TOS.

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

POP_JUMP_FORWARD_IF_NONE(delta)

Если значение TOS равно None, счетчик байт-кода увеличивается на дельта. Выдается значение TOS.

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

POP_JUMP_BACKWARD_IF_NONE(delta)

Если значение TOS равно None, счетчик байт-кода уменьшается на дельта. Выдается значение TOS.

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

JUMP_IF_TRUE_OR_POP(delta)

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

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

Изменено в версии 3.11: oparg теперь является относительной дельтой, а не абсолютной целью.

JUMP_IF_FALSE_OR_POP(delta)

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

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

Изменено в версии 3.11: oparg теперь является относительной дельтой, а не абсолютной целью.

FOR_ITER(delta)

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

LOAD_GLOBAL(namei)

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

Изменено в версии 3.11: Если установлен младший бит namei, то NULL помещается в стек перед глобальной переменной.

LOAD_FAST(var_num)

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

STORE_FAST(var_num)

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

DELETE_FAST(var_num)

Удаляет локальный co_varnames[var_num].

MAKE_CELL(i)

Создает новую ячейку в слоте i. Если этот слот не пуст, то это значение сохраняется в новой ячейке.

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

LOAD_CLOSURE(i)

Возвращает ссылку на ячейку, содержащуюся в слоте i хранилища «fast locals». Имя переменной co_fastlocalnames[i].

Обратите внимание, что LOAD_CLOSURE фактически является псевдонимом для LOAD_FAST. Он существует для того, чтобы сделать байт-код более читабельным.

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

LOAD_DEREF(i)

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

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

LOAD_CLASSDEREF(i)

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

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

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

STORE_DEREF(i)

Сохраняет данные в ячейке, содержащейся в слоте i хранилища «fast locals».

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

DELETE_DEREF(i)

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

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

Изменено в версии 3.11: i больше не смещается на длину co_varnames.

COPY_FREE_VARS(n)

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

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

RAISE_VARARGS(argc)

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

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

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

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

CALL(argc)

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

  • нулевой

  • Вызываемый

  • Позиционные аргументы

  • Именованные аргументы

или:

  • Вызываемый

  • self

  • Остальные позиционные аргументы

  • Именованные аргументы

argc - это сумма позиционных и именованных аргументов, за исключением self, когда NULL отсутствует.

CALL извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и возвращает возвращаемое значение, возвращаемое вызываемым объектом.

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

CALL_FUNCTION_EX(flags)

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

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

LOAD_METHOD(namei)

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

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

PRECALL(argc)

Префиксы CALL. Логически это не является операцией. Она существует для обеспечения эффективной специализации вызовов. argc - это количество аргументов, как описано в CALL.

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

PUSH_NULL

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

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

KW_NAMES(i)

Префиксы PRECALL. Сохраняет ссылку на co_consts[consti] во внутреннюю переменную для использования с помощью CALL. co_consts[consti] это должен быть кортеж из строк.

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

MAKE_FUNCTION(flags)

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

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

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

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

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

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

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

Изменено в версии 3.11: Полное имя в TOS было удалено.

BUILD_SLICE(argc)

Помещает объект slice в стек. 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 интерпретируется следующим образом:

  • (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)

ЭТО набор имен атрибутов ключевых слов, TOS1 - класс, с которым выполняется сопоставление, а TOS2 - объект сопоставления. count - количество позиционных вложенных шаблонов.

Введите TOS, TOS1 и TOS2. Если TOS2 является экземпляром TEST1 и имеет атрибуты позиции и ключевого слова, требуемые для count и TOS, введите набор извлеченных атрибутов. В противном случае введите None.

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

Изменено в версии 3.11: Ранее эта инструкция также вводила логическое значение, указывающее на успех (True) или неудачу (False).

RESUME(where)

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

Операнд where указывает, где встречается RESUME:

  • 0 Начало выполнения функции

  • 1 После выражения yield

  • 2 После выражения yield from

  • 3 После выражения await

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

RETURN_GENERATOR

Создайте генератор, сопрограмму или асинхронный генератор из текущего кадра. Очистите текущий кадр и верните только что созданный генератор.

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

SEND

Отправляет None в подгенератор этого генератора. Используется в операторах yield from и await.

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

ASYNC_GEN_WRAP

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

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

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

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

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