Spec-Zone.ru › Python 3.11

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

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

Модуль dis поддерживает анализ CPython байткода путём его дизассемблирования. 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)

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

Обратите внимание, что точное содержимое строк code info сильно зависит от реализации и может произвольно меняться в разных виртуальных машинах 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, 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 для поиска смещений, которые являются началом строк в исходном коде. Они генерируются как пары (offset, lineno).

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

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

dis.findlabels(code)

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

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

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

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

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

Изменено в версии 3.8: Добавлен параметр 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 является объектом генератора итератора или корутины, он оставляется как есть. В противном случае, реализует TOS = iter(TOS).

Новая функция в версии 3.5.

Бинарные и ин-плейс операции

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

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

BINARY_OP(op)

Реализует бинарные и in-place операторы (в зависимости от значения 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: Возврат объектов awaitable из __aiter__ больше не поддерживается.

GET_ANEXT

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

Новая функция в версии 3.5.

END_ASYNC_FOR

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

Новая функция в версии 3.8.

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

END_OF_DOCUMENT_MARKER
BEFORE_ASYNC_WITH

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

Добавлена в версии 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 и возвращает его из генератора.

SETUP_ANNOTATIONS

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

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

IMPORT_STAR

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

POP_EXCEPT

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

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

RERAISE

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

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

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

PUSH_EXC_INFO

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

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

CHECK_EXC_MATCH

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

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

CHECK_EG_MATCH

Производит сопоставление исключений для except*. Применяет split(TOS) к группе исключений, представляющей TOS1.

В случае совпадения извлекает два элемента из стека и помещает в стек несовпадающую подгруппу (None в случае полного совпадения) и затем совпадающую подгруппу. При отсутствии совпадения извлекает один элемент (тип совпадения) и помещает None.

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

PREP_RERAISE_STAR

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

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

WITH_EXCEPT_START

Вызывает функцию в позиции 4 стека с аргументами (тип, значение, трассировка), представляющими исключение в верхней части стека. Используется для реализации вызова 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 в tp_flags), помещает True в стек. В противном случае, помещает False.

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

MATCH_KEYS

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

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

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

STORE_NAME(namei)

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

DELETE_NAME(namei)

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

UNPACK_SEQUENCE(count)

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

UNPACK_EX(counts)

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

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

STORE_ATTR(namei)

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

DELETE_ATTR(namei)

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

STORE_GLOBAL(namei)

Действует как STORE_NAME, но сохраняет имя как глобальную переменную.

DELETE_GLOBAL(namei)

Действует как DELETE_NAME, но удаляет глобальное имя.

LOAD_CONST(consti)

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

LOAD_NAME(namei)

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

BUILD_TUPLE(count)

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

BUILD_LIST(count)

Действует как BUILD_TUPLE, но создает список.

BUILD_SET(count)

Действует как BUILD_TUPLE, но создает множество.

BUILD_MAP(count)

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

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

BUILD_CONST_KEY_MAP(count)

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

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

BUILD_STRING(count)

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

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

LIST_TO_TUPLE

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

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

LIST_EXTEND(i)

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

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

SET_UPDATE(i)

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

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

DICT_UPDATE(i)

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

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

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

IMPORT_FROM(namei)

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

JUMP_FORWARD(delta)

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

JUMP_BACKWARD(delta)

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

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

JUMP_BACKWARD_NO_INTERRUPT(delta)

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

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

POP_JUMP_FORWARD_IF_TRUE(delta)

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

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

POP_JUMP_BACKWARD_IF_TRUE(delta)

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

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

POP_JUMP_FORWARD_IF_FALSE(delta)

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

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

POP_JUMP_BACKWARD_IF_FALSE(delta)

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

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

POP_JUMP_FORWARD_IF_NOT_NONE(delta)

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

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

POP_JUMP_BACKWARD_IF_NOT_NONE(delta)

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

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

POP_JUMP_FORWARD_IF_NONE(delta)

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

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

POP_JUMP_BACKWARD_IF_NONE(delta)

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

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

JUMP_IF_TRUE_OR_POP(delta)

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

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

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

JUMP_IF_FALSE_OR_POP(delta)

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

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

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

FOR_ITER(delta)

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

LOAD_GLOBAL(namei)

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

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

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].

MAKE_CELL(i)

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

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

LOAD_CLOSURE(i)

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

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

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

LOAD_DEREF(i)

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

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

LOAD_CLASSDEREF(i)

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

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

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

STORE_DEREF(i)

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

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

DELETE_DEREF(i)

Очищает ячейку, содержащуюся в слоте i хранилища «быстрых локальных переменных». Используется оператором 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, если таковые имеются. В стеке (в порядке возрастания) находятся:

  • NULL
  • Вызываемый объект
  • Позиционные аргументы
  • Именованные аргументы

или:

  • Вызываемый объект
  • 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 при вызове незавязанного метода. В противном случае, 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)

Помещает объект среза на стек. 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.

MATCH_CLASS(count)

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

Извлекаются TOS, TOS1 и TOS2. Если TOS2 является экземпляром TOS1 и имеет необходимые позиционные и ключевые атрибуты, согласно 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. Используется для yield в асинхронных генераторах.

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

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

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/dis.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API