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 -
Показывать встроенные кэши.
Добавлено в версии 3.13.
-
-O, --show-offsets -
Показывать смещения инструкций.
Добавлено в версии 3.13.
Если указан infile, дизассемблированный код будет записан в stdout. В противном случае дизассемблирование выполняется для скомпилированного исходного кода, полученного из stdin.
Анализ байт-кода
Добавлено в версии 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.
-
dis.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: Вместо атрибутов
co_firstlinenoиco_lnotabобъекта кода используется методco_lines(), введенный в PEP 626.Изменено в версии 3.13: Для байт-кода, который не сопоставляется со строками исходного кода, номера строк могут быть
None.
-
dis.findlabels(code) -
Находит все смещения в строке необработанного скомпилированного байт-кода code, являющиеся целями переходов, и возвращает список этих смещений.
-
dis.stack_effect(opcode, oparg=None, *, jump=None) -
Вычисляет эффект opcode на стек при аргументе oparg.
Если у кода есть цель перехода и jump равно
True,stack_effect()вернет эффект перехода на стек. Если jump равноFalse, будет возвращен эффект отсутствия перехода на стек. Если же jump равноNone(значение по умолчанию), будет возвращен максимальный эффект на стек для обоих случаев.Добавлено в версии 3.4.
Изменено в версии 3.8: Добавлен параметр jump.
Изменено в версии 3.13: Если
opargопущен (или равенNone), теперь возвращается эффект на стек дляoparg=0. Ранее это вызывало ошибку для кодов операций, использующих аргумент. Кроме того, передача целого числаopargбольше не вызывает ошибку, еслиopcodeего не использует; в этом случаеopargигнорируется.
Инструкции байт-кода Python
Функция get_instructions() и класс Bytecode предоставляют сведения об инструкциях байт-кода в виде экземпляров Instruction:
-
class dis.Instruction -
Сведения об операции байт-кода
-
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, если этот код операции начинает строку исходного кода, в противном случаеFalse
-
line_number -
номер строки исходного кода, связанной с этим кодом операции (если есть), в противном случае
None
-
is_jump_target -
True, если сюда переходит другой код, в противном случаеFalse
-
jump_target -
индекс целевого адреса перехода в байт-коде, если это инструкция перехода, в противном случае
None
-
positions -
Объект
dis.Positions, содержащий начальные и конечные позиции, охватываемые этой инструкцией.
-
cache_info -
Сведения о записях кэша этой инструкции в виде троек формата
(name, size, data), гдеnameиsizeописывают формат кэша, а данные — его содержимое.cache_infoравноNone, если у инструкции нет кэша.
Добавлено в версии 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.Логически это пространство является частью предшествующей инструкции. Для многих кодов операций требуется точное число следующих за ними записей кэша; в таком случае интерпретатор пропускает их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому при чтении или изменении необработанного адаптивного байт-кода с быстрыми данными следует соблюдать особую осторожность.
Добавлено в версии 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: Возвращать объекты, допускающие ожидание, из
__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 стека с аргументами (type, val, tb), представляющими исключение на вершине стека. Используется для реализации вызова
context_manager.__exit__(*exc_info()), когда в оператореwithпроизошло исключение.Добавлено в версии 3.9.
Изменено в версии 3.11: Функция
__exit__находится в позиции 4 стека, а не 7. Теперь представление исключения в стеке состоит из одного элемента, а не из трёх.
-
LOAD_ASSERTION_ERROR -
Помещает
AssertionErrorв стек. Используется операторомassert.Добавлено в версии 3.9.
-
LOAD_BUILD_CLASS -
Помещает
builtins.__build_class__()в стек. Позже он вызывается для создания класса.
-
BEFORE_WITH -
Эта инструкция выполняет несколько операций перед началом блока 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(или, говоря точнее, если в егоtp_flagsустановлен флагPy_TPFLAGS_MAPPING), помещаетTrueв стек. В противном случае помещаетFalse.Добавлено в версии 3.10.
-
MATCH_SEQUENCE -
Если
STACK[-1]является экземпляромcollections.abc.Sequenceи не является экземпляромstr/bytes/bytearray(или, говоря точнее, если в егоtp_flagsустановлен флагPy_TPFLAGS_SEQUENCE), помещаетTrueв стек. В противном случае помещаетFalse.Добавлено в версии 3.10.
-
MATCH_KEYS -
STACK[-1]— это кортеж ключей отображения, аSTACK[-2]— объект, сопоставляемый с шаблоном. ЕслиSTACK[-2]содержит все ключи изSTACK[-1], помещает в стекtupleс соответствующими значениями. В противном случае помещает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
где 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.
-
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) -
Копирует
nсвободных переменных (переменных замыкания) из замыкания в кадр. Устраняет необходимость в специальном коде на стороне вызывающего при вызове замыканий.Добавлено в версии 3.11.
-
RAISE_VARARGS(argc) -
Вызывает исключение одним из трёх способов, предусмотренных инструкцией
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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/dis.html