Spec-Zone.ru › Python 3.13

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.

Изменено в версии 3.12: Аргумент перехода — это смещение целевой инструкции относительно инструкции, которая следует непосредственно после записей инструкции перехода CACHE.

Вследствие этого, присутствие инструкций CACHE прозрачно для переходов вперёд, но необходимо учитывать их при рассуждениях о переходах назад.

Изменено в версии 3.13: Вывод показывает логические метки, а не смещения инструкций для целей переходов и обработчиков исключений. Были добавлены параметры -O и show_offsets.

Пример: Учитывая функцию myfunc():

def myfunc(alist):
    return len(alist)

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

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

  3           LOAD_GLOBAL              1 (len + NULL)
              LOAD_FAST                0 (alist)
              CALL                     1
              RETURN_VALUE

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

Командная строка

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

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

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

-h, --help

Отобразить справку и выйти.

-C, --show-caches

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

-O, --show-offsets

Показать смещения инструкций.

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

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

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

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

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

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

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

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

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

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

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

Если show_offsets равно 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
CALL
RETURN_VALUE

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

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

dis.code_info(x)

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

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

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

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

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

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

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

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

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

dis.dis(x=None, *, file=None, depth=None, 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.

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

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

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

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

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

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

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

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

  1. номер строки, для первой инструкции каждой строки
  2. текущая инструкция, указанная как -->,
  3. меткированная инструкция, указанная >>,
  4. адрес инструкции,
  5. имя кода операции,
  6. параметры операции и
  7. интерпретация параметров в скобках.

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

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

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

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

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

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

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

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

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

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

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

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

Изменена в версии 3.13: Параметр show_caches устарел и не имеет эффекта. Итератор генерирует экземпляры Instruction с заполненным полем cache_info (независимо от значения show_caches), и он больше не генерирует отдельные элементы для записей кэша.

dis.findlinestarts(code)

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

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

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

Изменена в версии 3.13: Номера строк могут быть None для байткода, который не соответствует строкам исходного кода.

dis.findlabels(code)

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

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

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

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

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

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

Изменён в версии 3.13: Если oparg опущено (или None), эффект стека теперь возвращается для oparg=0. Ранее это вызывало ошибку для кодов операций, использующих свой аргумент. Также больше нет ошибки при передаче целого числа oparg в том случае, когда opcode не использует его; oparg в этом случае игнорируется.

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

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

class dis.Instruction

Подробности байт-операции

opcode

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

opname

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

baseopcode

Числовой код базовой операции, если операция специализирована; в противном случае равен opcode

baseopname

Читаемое человеком имя базовой операции, если операция специализирована; в противном случае равно opname

arg

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

oparg

Псевдоним для arg

argval

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

argrepr

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

offset

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

start_offset

Начальный индекс операции в последовательности байткода, включая префиксные EXTENDED_ARG операции, если они присутствуют; в противном случае равен offset

cache_offset

Начальный индекс записей кэша, следующих за операцией

end_offset

Конечный индекс записей кэша, следующих за операцией

starts_line

True если эта операция opcode начинает строку исходного кода, в противном случае False

line_number

Номер строки исходного кода, связанный с этим opcode (если есть), в противном случае None

is_jump_target

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

jump_target

Индекс байткода целевой точки перехода, если это операция перехода, в противном случае None

positions

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

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

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

Изменено в версии 3.13: Изменено поле starts_line.

Добавлены поля start_offset, cache_offset, end_offset, baseopname, baseopcode, jump_target, oparg, line_number и cache_info.

class dis.Positions

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

lineno
end_lineno
col_offset
end_col_offset

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

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

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

В дальнейшем мы будем ссылаться на стек интерпретатора как на STACK и описывать операции над ним так, как будто это список Python. Верх стека соответствует STACK[-1] в этом языке.

NOP

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

POP_TOP

Удаляет элемент из вершины стека:

STACK.pop()
END_FOR

Удаляет элемент из вершины стека. Эквивалентно POP_TOP. Используется для очистки в конце циклов, отсюда и название.

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

END_SEND

Реализует del STACK[-2]. Используется для очистки при выходе генератора.

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

COPY(i)

Помещает i-й элемент в верх стека, не удаляя его из исходного места:

assert i > 0
STACK.append(STACK[-i])

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

SWAP(i)

Меняет местами верх стека с i-м элементом:

STACK[-i], STACK[-1] = STACK[-1], STACK[-i]

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

CACHE

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

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

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

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

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

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

UNARY_NEGATIVE

Реализует STACK[-1] = -STACK[-1].

UNARY_NOT

Реализует STACK[-1] = not STACK[-1].

Изменено в версии 3.13: Эта инструкция теперь требует точного операнда bool.

UNARY_INVERT

Реализует STACK[-1] = ~STACK[-1].

GET_ITER

Реализует STACK[-1] = iter(STACK[-1]).

GET_YIELD_FROM_ITER

Если STACK[-1] является объектом генераторного итератора или корутины, он остается как есть. В противном случае реализует STACK[-1] = iter(STACK[-1]).

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

TO_BOOL

Реализует STACK[-1] = bool(STACK[-1]).

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

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

Бинарные операции удаляют два верхних элемента из стека (STACK[-1] и STACK[-2]). Они выполняют операцию, а затем помещают результат обратно в стек.

Операции на месте похожи на бинарные операции, но операция выполняется на месте, если STACK[-2] её поддерживает, и результирующее значение STACK[-1] может (но не обязательно) быть исходным значением STACK[-2].

BINARY_OP(op)

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

rhs = STACK.pop()
lhs = STACK.pop()
STACK.append(lhs op rhs)

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

BINARY_SUBSCR

Реализует:

key = STACK.pop()
container = STACK.pop()
STACK.append(container[key])
STORE_SUBSCR

Реализует:

key = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[key] = value
DELETE_SUBSCR

Реализует:

key = STACK.pop()
container = STACK.pop()
del container[key]
BINARY_SLICE

Реализует:

end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
STACK.append(container[start:end])

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

STORE_SLICE

Реализует:

end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
values = STACK.pop()
container[start:end] = value

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

Команды для сопроцедур

GET_AWAITABLE(where)

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

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

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

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

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

GET_AITER

Реализует STACK[-1] = STACK[-1].__aiter__().

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

Изменено в версии 3.7: Возвращение объектов awaitable из __aiter__ больше не поддерживается.

GET_ANEXT

Реализует STACK.append(get_awaitable(STACK[-1].__anext__())) в стек. Смотрите GET_AWAITABLE для подробностей о get_awaitable.

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

END_ASYNC_FOR

Завершает цикл async for. Обрабатывает исключение, поднятое при ожидании следующего элемента. В стеке содержится асинхронный итерируемый объект в STACK[-2] и поднятое исключение в STACK[-1]. Оба из них удаляются. Если исключение не является StopAsyncIteration, оно повторно поднимается.

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

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

CLEANUP_THROW

Обрабатывает исключение, поднятое во время вызова throw() или close() через текущую область видимости. Если STACK[-1] является экземпляром StopIteration, удаляет три значения из стека и помещает его value член. В противном случае, повторно поднимает STACK[-1].

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

BEFORE_ASYNC_WITH

Разрешает __aenter__ и __aexit__ из STACK[-1]. Помещает __aexit__ и результат __aenter__() в стек:

STACK.extend((__aexit__, __aenter__())

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

Разные команды

SET_ADD(i)

Реализует:

item = STACK.pop()
set.add(STACK[-i], item)

Используется для реализации множественных генераций.

LIST_APPEND(i)

Реализует:

item = STACK.pop()
list.append(STACK[-i], item)

Используется для реализации генераций списков.

MAP_ADD(i)

Реализует:

value = STACK.pop()
key = STACK.pop()
dict.__setitem__(STACK[-i], key, value)

Используется для реализации генераций словарей.

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

Изменено в версии 3.8: Значение словаря — STACK[-1], а ключ словаря — STACK[-2]. Раньше они были наоборот.

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

RETURN_VALUE

Возвращает STACK[-1] вызывающей функции.

RETURN_CONST(consti)

Возвращает co_consts[consti] вызывающей функции.

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

YIELD_VALUE

Возвращает STACK.pop() из генератора.

Изменено в версии 3.11: oparg установлен в глубину стека.

Изменено в версии 3.12: oparg установлен в глубину блока исключений для эффективного закрытия генераторов.

Изменено в версии 3.13: oparg — 1 если эта инструкция является частью yield-from или await, и 0 в противном случае.

SETUP_ANNOTATIONS

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

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

POP_EXCEPT

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

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

RERAISE

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

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

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

PUSH_EXC_INFO

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

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

CHECK_EXC_MATCH

Выполняет сопоставление исключений для except. Проверяет, является ли STACK[-2] исключением, соответствующим STACK[-1]. Удаляет STACK[-1] и помещает логический результат проверки.

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

END_OF_DOCUMENT_MARKER
CHECK_EG_MATCH

Выполняет сопоставление исключений для except*. Применяет split(STACK[-1]) к группе исключений, представляющей STACK[-2].

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

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

WITH_EXCEPT_START

Вызывает функцию в позиции 4 на стеке с аргументами (тип, значение, 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

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

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

GET_LEN

Выполнить STACK.append(len(STACK[-1])). Используется в операторах match, где необходимо сравнение со структурой шаблона.

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

MATCH_MAPPING

Если STACK[-1] является экземпляром collections.abc.Mapping (или, более технически, если у него установлен флаг Py_TPFLAGS_MAPPING в его tp_flags), поместить True на стек. В противном случае, поместить False.

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

MATCH_SEQUENCE

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

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

MATCH_KEYS

STACK[-1] — это кортеж ключей отображения, а STACK[-2] — объект-подлежащее. Если STACK[-2] содержит все ключи в STACK[-1], поместить на стек кортеж, содержащий соответствующие значения. В противном случае, поместить None.

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

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

STORE_NAME(namei)

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

DELETE_NAME(namei)

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

UNPACK_SEQUENCE(count)

Распаковывает STACK[-1] в count отдельных значений, которые помещаются на стек справа налево. Требуется ровно count значений:

assert(len(STACK[-1]) == count)
STACK.extend(STACK.pop()[:-count-1:-1])
UNPACK_EX(counts)

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

Количество значений до и после списка ограничено 255.

Количество значений перед списком закодировано в аргументе оператора. Количество значений после списка, если таковые имеются, кодируется с использованием EXTENDED_ARG. Вследствие этого, аргумент можно рассматривать как значение в два байта, где младший байт counts — количество значений перед списком, старший байт counts — количество значений после него.

Извлечённые значения помещаются на стек справа налево, т.е. a, *b, c = d будет сохранён после выполнения как STACK.extend((a, b, c)).

STORE_ATTR(namei)

Реализует:

obj = STACK.pop()
value = STACK.pop()
obj.name = value

где namei — индекс имени в co_names объекта кода.

DELETE_ATTR(namei)

Реализует:

obj = STACK.pop()
del obj.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]. Имя ищется в локальных переменных, затем в глобальных переменных, а затем в встроенных функциях.

LOAD_LOCALS

Помещает на стек ссылку на словарь локальных переменных. Это используется для подготовки словарей пространств имён для LOAD_FROM_DICT_OR_DEREF и LOAD_FROM_DICT_OR_GLOBALS.

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

END_OF_DOCUMENT_MARKER
LOAD_FROM_DICT_OR_GLOBALS(i)

Извлекает отображение со стека и ищет значение для co_names[namei]. Если имя не найдено, ищет его в глобальных переменных, а затем в встроенных, аналогично LOAD_GLOBAL. Используется для загрузки глобальных переменных в областях аннотаций внутри тел классов.

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

BUILD_TUPLE(count)

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

if count == 0:
    value = ()
else:
    value = tuple(STACK[-count:])
    STACK = STACK[:-count]

STACK.append(value)
BUILD_LIST(count)

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

BUILD_SET(count)

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

BUILD_MAP(count)

Помещает новый словарь на стек. Извлекает 2 * count элементов, чтобы словарь содержал count записей: {..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.

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

BUILD_CONST_KEY_MAP(count)

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

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

BUILD_STRING(count)

Конкатенирует count строк со стека и помещает получившуюся строку на стек.

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

LIST_EXTEND(i)

Реализует:

seq = STACK.pop()
list.extend(STACK[-i], seq)

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

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

SET_UPDATE(i)

Реализует:

seq = STACK.pop()
set.update(STACK[-i], seq)

Используется для создания множеств.

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

DICT_UPDATE(i)

Реализует:

map = STACK.pop()
dict.update(STACK[-i], map)

Используется для создания словарей.

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

DICT_MERGE(i)

Аналогично DICT_UPDATE, но генерирует исключение для дублирующихся ключей.

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

LOAD_ATTR(namei)

Если младший бит namei не установлен, это заменяет STACK[-1] на getattr(STACK[-1], co_names[namei>>1]).

Если младший бит namei установлен, это попытается загрузить метод с именем co_names[namei>>1] из объекта STACK[-1]. STACK[-1] извлекается. Этот байткод различает два случая: если у STACK[-1] есть метод с правильным именем, байткод помещает несвязанный метод и STACK[-1]. STACK[-1] будет использоваться в качестве первого аргумента (self) CALL или CALL_KW при вызове несвязанного метода. В противном случае, NULL и объект, возвращаемый получением атрибута, помещаются на стек.

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

LOAD_SUPER_ATTR(namei)

Этот байткод реализует super(), как в его форме с нулевым аргументом, так и в форме с двумя аргументами (например, super().method(), super().attr и super(cls, self).method(), super(cls, self).attr).

Извлекает три значения со стека (сверху вниз):

  • self: первый аргумент текущего метода
  • cls: класс, в котором был определён текущий метод
  • глобальная переменная super

По отношению к своему аргументу, он работает аналогично LOAD_ATTR, за исключением того, что namei сдвигается влево на 2 бита, а не на 1.

Младший бит namei сигнализирует о попытке загрузки метода, как с LOAD_ATTR, что приводит к помещении NULL и загруженного метода. Когда он сброшен, на стек помещается одно значение.

Второй младший бит namei, если установлен, означает, что это был вызов с двумя аргументами super() (сброшен означает нулевой аргумент).

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

COMPARE_OP(opname)

Выполняет булево операцию. Название операции можно найти в cmp_op[opname >> 5]. Если пятый бит opname установлен (opname & 16), результат должен быть приведён к bool.

Изменено в версии 3.13: Пятый младший бит oparg теперь указывает на принудительное преобразование в bool.

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

IMPORT_FROM(namei)

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

JUMP_FORWARD(delta)

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

JUMP_BACKWARD(delta)

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

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

JUMP_BACKWARD_NO_INTERRUPT(delta)

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

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

POP_JUMP_IF_TRUE(delta)

Если STACK[-1] истинно, увеличивает счётчик байткода на delta. STACK[-1] извлекается.

Изменено в версии 3.11: Oparg теперь является относительным смещением, а не абсолютной целью. Этот байткод является псевдоинструкцией, заменённой в окончательном байткоде на управляемые версии (вперёд/назад).

Изменено в версии 3.12: Это больше не псевдоинструкция.

Изменено в версии 3.13: Эта инструкция теперь требует точного операнда bool.

END_OF_DOCUMENT_MARKER
POP_JUMP_IF_FALSE(delta)

Если STACK[-1] ложно, увеличивает счётчик байткода на delta. STACK[-1] извлекается.

Изменено в версии 3.11: Операнд oparg теперь является относительным смещением, а не абсолютной целью. Данный оператор — псевдоинструкция, заменённая в окончательном байткоде направленными версиями (вперед/назад).

Изменено в версии 3.12: Это больше не псевдоинструкция.

Изменено в версии 3.13: Данная инструкция теперь требует точного операнда bool.

POP_JUMP_IF_NOT_NONE(delta)

Если STACK[-1] не равно None, увеличивает счётчик байткода на delta. STACK[-1] извлекается.

Данный оператор — псевдоинструкция, заменённая в окончательном байткоде направленными версиями (вперед/назад).

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

Изменено в версии 3.12: Это больше не псевдоинструкция.

POP_JUMP_IF_NONE(delta)

Если STACK[-1] равно None, увеличивает счётчик байткода на delta. STACK[-1] извлекается.

Данный оператор — псевдоинструкция, заменённая в окончательном байткоде направленными версиями (вперед/назад).

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

Изменено в версии 3.12: Это больше не псевдоинструкция.

FOR_ITER(delta)

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

Изменено в версии 3.12: До версии 3.11 итератор удалялся, когда он исчерпывался.

LOAD_GLOBAL(namei)

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

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

LOAD_FAST(var_num)

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

Изменено в версии 3.12: Данный оператор используется только в ситуациях, когда локальная переменная гарантированно инициализирована. Он не может вызвать UnboundLocalError.

LOAD_FAST_LOAD_FAST(var_nums)

Помещает ссылки на co_varnames[var_nums >> 4] и co_varnames[var_nums & 15] в стек.

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

LOAD_FAST_CHECK(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек, вызывая UnboundLocalError, если локальная переменная не была инициализирована.

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

LOAD_FAST_AND_CLEAR(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек (или помещает NULL в стек, если локальная переменная не была инициализирована) и устанавливает co_varnames[var_num] в NULL.

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

STORE_FAST(var_num)

Сохраняет STACK.pop() в локальную переменную co_varnames[var_num].

STORE_FAST_STORE_FAST(var_nums)

Сохраняет STACK[-1] в co_varnames[var_nums >> 4] и STACK[-2] в co_varnames[var_nums & 15].

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

STORE_FAST_LOAD_FAST(var_nums)

Сохраняет STACK.pop() в локальную переменную co_varnames[var_nums >> 4] и помещает ссылку на локальную переменную co_varnames[var_nums & 15] в стек.

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

DELETE_FAST(var_num)

Удаляет локальную переменную co_varnames[var_num].

MAKE_CELL(i)

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

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

LOAD_DEREF(i)

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

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

LOAD_FROM_DICT_OR_DEREF(i)

Извлекает отображение из стека и ищет имя, связанное со слотом i хранилища «быстрых локальных переменных» в этом отображении. Если имя не найдено там, загружает его из ячейки, содержащейся в слоте i, аналогично LOAD_DEREF. Это используется для загрузки переменных замыкания в телах классов (ранее использовалось LOAD_CLASSDEREF ) и в областях аннотаций в телах классов.

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

STORE_DEREF(i)

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

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

DELETE_DEREF(i)

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

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

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

COPY_FREE_VARS(n)

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

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

RAISE_VARARGS(argc)

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

  • 0: raise (повторный вызов предыдущего исключения)
  • 1: raise STACK[-1] (вызов экземпляра или типа исключения в STACK[-1])
  • 2: raise STACK[-2] from STACK[-1] (вызов экземпляра или типа исключения в STACK[-2] с __cause__ установленным на STACK[-1])
END_OF_DOCUMENT_MARKER
CALL(argc)

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

  • Вызываемый объект
  • self или NULL
  • Остальные позиционные аргументы

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

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

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

Изменено в версии 3.13: Вызываемый объект теперь всегда находится в том же положении в стеке.

Изменено в версии 3.13: Вызовы с именованными аргументами теперь обрабатываются инструкцией CALL_KW.

CALL_KW(argc)

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

  • Вызываемый объект
  • self или NULL
  • Остальные позиционные аргументы
  • Именованные аргументы
  • Кортеж tuple имён именованных аргументов

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

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

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

CALL_FUNCTION_EX(flags)

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

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

PUSH_NULL

Помещает NULL в стек. Используется в последовательности вызова для согласования с NULL помещённым инструкцией LOAD_METHOD для вызовов не через методы.

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

MAKE_FUNCTION

Помещает в стек новый объект функции, созданный из объекта кода по адресу STACK[-1].

Изменено в версии 3.10: Значение флага 0x04 — кортеж строк вместо словаря

Изменено в версии 3.11: Квалифицированное имя по адресу STACK[-1] было удалено.

Изменено в версии 3.13: Дополнительные атрибуты функции в стеке, сигнализируемые флагами oparg, были удалены. Теперь они используют SET_FUNCTION_ATTRIBUTE.

SET_FUNCTION_ATTRIBUTE(flag)

Устанавливает атрибут объекта функции. Ожидает функцию по адресу STACK[-1] и значение атрибута, которое нужно установить, по адресу STACK[-2]; потребляет оба и оставляет функцию по адресу STACK[-1].

Флаг определяет, какой атрибут устанавливать:

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

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

BUILD_SLICE(argc)

Помещает объект среза в стек. argc должно быть 2 или 3. Если 2, реализует:

end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end))

Если 3, реализует:

step = STACK.pop()
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end, step))

См. встроенную функцию slice() для получения дополнительной информации.

EXTENDED_ARG(ext)

Предполагает любую инструкцию с аргументом, слишком большим для размещения в стандартном байтовом формате. ext содержит дополнительный байт, который выступает в качестве старших битов в аргументе. Для каждой инструкции допускается не более трёх префиксных EXTENDED_ARG значений, образующих аргумент от двух до четырёх байтов.

CONVERT_VALUE(oparg)

Преобразование значения в строку, в зависимости от oparg:

value = STACK.pop()
result = func(value)
STACK.append(result)
  • oparg == 1: вызов str() над value
  • oparg == 2: вызов repr() над value
  • oparg == 3: вызов ascii() над value

Используется для реализации форматированных строковых литералов (f-строки).

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

FORMAT_SIMPLE

Форматирование значения, находящегося на вершине стека:

value = STACK.pop()
result = value.__format__("")
STACK.append(result)

Используется для реализации форматированных строковых литералов (f-строки).

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

FORMAT_WITH_SPEC

Форматирование заданного значения с заданным форматом:

spec = STACK.pop()
value = STACK.pop()
result = value.__format__(spec)
STACK.append(result)

Используется для реализации форматированных строковых литералов (f-строки).

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

MATCH_CLASS(count)

STACK[-1] — кортеж имён именованных атрибутов, STACK[-2] — класс, по которому происходит сопоставление, и STACK[-3] — объект, на котором выполняется сопоставление. count — количество позиционных подшаблонов.

Извлечь STACK[-1], STACK[-2], и STACK[-3]. Если STACK[-3] является экземпляром STACK[-2] и имеет позиционные и именованные атрибуты, необходимые count и STACK[-1], поместить кортеж извлечённых атрибутов в стек. В противном случае поместить None в стек.

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

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

RESUME(context)

Пустая операция. Выполняет внутренние операции по отслеживанию, отладке и оптимизации.

Аргумент context состоит из двух частей. Низшие два бита указывают, где происходит RESUME:

  • 0 Начало функции, которая не является генератором, корутиной или асинхронным генератором
  • 1 После выражения yield
  • 2 После выражения yield from
  • 3 После выражения await

Следующий бит — 1 если RESUME происходит на глубине исключения 1, и 0 в противном случае.

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

Изменено в версии 3.13: Значение oparg было изменено, чтобы включить информацию о глубине обработки исключений

RETURN_GENERATOR

Создаёт генератор, корутину или асинхронный генератор из текущей рамки. Используется как первая инструкция в объекте кода для указанных выше вызываемых объектов. Очищает текущую рамку и возвращает вновь созданный генератор.

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

SEND(delta)

Эквивалентно STACK[-1] = STACK[-2].send(STACK[-1]).

Используется в операциях yield from и await.

Если вызов генерирует исключение StopIteration, извлекает верхнее значение из стека, помещает в стек атрибут value исключения и увеличивает счётчик байткода на delta.

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

HAVE_ARGUMENT

Это не совсем оператор. Он обозначает разделительную линию между операторами в диапазоне [0,255], которые не используют аргумент, и теми, которые используют (соответственно < HAVE_ARGUMENT и >= HAVE_ARGUMENT).

Если ваше приложение использует псевдоинструкции или специализированные инструкции, используйте коллекцию hasarg вместо этого.

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

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

Устарело начиная с версии 3.13: Используйте hasarg вместо этого.

CALL_INTRINSIC_1

Вызывает встроенную функцию с одним аргументом. Передает STACK[-1] в качестве аргумента и устанавливает STACK[-1] в результат. Используется для реализации функциональности, которая не является критически важной для производительности.

Операнд определяет, какая встроенная функция вызывается:

Операнд

Описание

INTRINSIC_1_INVALID

Недействительно

INTRINSIC_PRINT

Выводит аргумент в стандартный вывод. Используется в REPL.

INTRINSIC_IMPORT_STAR

Выполняет import * для указанного модуля.

INTRINSIC_STOPITERATION_ERROR

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

INTRINSIC_ASYNC_GEN_WRAP

Оборачивает значение асинхронного генератора

INTRINSIC_UNARY_POSITIVE

Выполняет унарную операцию +

INTRINSIC_LIST_TO_TUPLE

Преобразует список в кортеж

INTRINSIC_TYPEVAR

Создаёт typing.TypeVar

INTRINSIC_PARAMSPEC

Создаёт typing.ParamSpec

INTRINSIC_TYPEVARTUPLE

Создаёт typing.TypeVarTuple

INTRINSIC_SUBSCRIPT_GENERIC

Возвращает typing.Generic с аргументом в качестве индекса

INTRINSIC_TYPEALIAS

Создаёт typing.TypeAliasType; используется в инструкции type. Аргументом является кортеж, содержащий имя псевдонима типа, параметры типа и значение.

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

CALL_INTRINSIC_2

Вызывает встроенную функцию с двумя аргументами. Используется для реализации функциональности, которая не является критически важной для производительности:

arg2 = STACK.pop()
arg1 = STACK.pop()
result = intrinsic2(arg1, arg2)
STACK.append(result)

Операнд определяет, какая встроенная функция вызывается:

Операнд

Описание

INTRINSIC_2_INVALID

Недействительно

INTRINSIC_PREP_RERAISE_STAR

Вычисляет ExceptionGroup для повышения из try-except*.

INTRINSIC_TYPEVAR_WITH_BOUND

Создаёт typing.TypeVar с ограничением.

INTRINSIC_TYPEVAR_WITH_CONSTRAINTS

Создаёт typing.TypeVar с ограничениями.

INTRINSIC_SET_FUNCTION_TYPE_PARAMS

Устанавливает атрибут __type_params__ функции.

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

Псевдоинструкции

Эти операторы не появляются в байт-коде Python. Они используются компилятором, но заменяются реальными операторами или удаляются перед генерацией байт-кода.

SETUP_FINALLY(target)

Настраивает обработчик исключений для следующего блока кода. Если возникнет исключение, уровень стека значений восстанавливается до текущего состояния, и управление передаётся обработчику исключений в target.

SETUP_CLEANUP(target)

Как SETUP_FINALLY, но в случае исключения также помещает последнюю инструкцию (lasti) на стек, чтобы RERAISE мог её восстановить. Если возникнет исключение, уровень стека значений и последняя инструкция в кадре восстанавливаются до их текущего состояния, и управление передаётся обработчику исключений в target.

SETUP_WITH(target)

Как SETUP_CLEANUP, но в случае исключения из стека извлекается ещё один элемент перед передачей управления обработчику исключений в target.

Этот вариант используется в конструкциях with и async with, которые помещают возвращаемое значение метода контекстного менеджера __enter__() или __aenter__() в стек.

POP_BLOCK

Помечает конец блока кода, связанного с последними SETUP_FINALLY, SETUP_CLEANUP или SETUP_WITH.

JUMP
JUMP_NO_INTERRUPT

Ненаправленные относительные инструкции перехода, которые заменяются их направленными (прямыми/обратными) аналогами ассемблером.

LOAD_CLOSURE(i)

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

Обратите внимание, что LOAD_CLOSURE заменяется на LOAD_FAST в ассемблере.

Изменено в версии 3.13: Этот оператор теперь является псевдоинструкцией.

LOAD_METHOD

Оптимизированный поиск не связанного метода. Выводится как оператор LOAD_ATTR с установленным флагом в аргументе.

Сборки кодов операций

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

Изменено в версии 3.12: Теперь сборки также содержат псевдоинструкции и инструментированные инструкции. Это коды операций со значениями >= MIN_PSEUDO_OPCODE и >= MIN_INSTRUMENTED_OPCODE.

dis.opname

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

dis.opmap

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

dis.cmp_op

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

dis.hasarg

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

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

dis.hasconst

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

dis.hasfree

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

dis.hasname

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

dis.hasjump

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

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

dis.haslocal

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

dis.hascompare

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

dis.hasexc

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

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

dis.hasjrel

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

Устарело начиная с версии 3.13: Все переходы теперь относительные. Используйте hasjump.

dis.hasjabs

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

Устарело начиная с версии 3.13: Все переходы теперь относительные. Этот список пуст.

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

Spec-Zone.ru

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