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 был предоставлен. Вывод разделен на следующие столбцы:
- номер строки, для первой инструкции каждой строки
- текущая инструкция, указанная как
-->, - меткированная инструкция, указанная
>>, - адрес инструкции,
- имя кода операции,
- параметры операции и
- интерпретация параметров в скобках.
Интерпретация параметров распознает имена локальных и глобальных переменных, значения констант, целевые адреса ветвления и операторы сравнения.
Разбор записывается в текст в предоставленный аргумент 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.
-
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, если это возможно.
-
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
-
DELETE_ATTR(namei) -
Реализует:
obj = STACK.pop() del obj.name
-
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.
-
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.
-
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])
- 0:
-
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.TypeVarINTRINSIC_PARAMSPECСоздаёт
typing.ParamSpecINTRINSIC_TYPEVARTUPLEСоздаёт
typing.TypeVarTupleINTRINSIC_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