dis
— Дизассемблер для байткода Python¶
Источник: Lib/dis.py
Модуль dis
поддерживает анализ CPython bytecode путем его дизассемблирования. Байткод CPython, который этот модуль принимает на вход, определен в файле Include/opcode.h
и используется компилятором и интерпретатором.
Детали реализации CPython: Байткод - это деталь реализации интерпретатора CPython. Нет никаких гарантий, что байткод не будет добавлен, удален или изменен между версиями Python. Использование этого модуля не должно рассматриваться как работа в разных виртуальных машинах Python или выпусках Python.
Изменено в версии 3.6: Используйте 2 байта для каждой инструкции. Ранее количество байт варьировалось в зависимости от инструкции.
Изменено в версии 3.10: Аргументом инструкций перехода, обработки исключений и циклов теперь является смещение инструкции, а не смещение байта.
Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими строчными записями в кэше, которые имеют вид инструкций CACHE
. По умолчанию эти инструкции скрыты, но их можно показать, передав show_caches=True
любой утилите dis
. Кроме того, интерпретатор теперь адаптирует байткод, чтобы специализировать его для различных условий выполнения. Адаптивный байткод можно показать, передав adaptive=True
.
Изменено в версии 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
, то дизассемблированный код будет записан в stdout. В противном случае дизассемблирование выполняется на скомпилированном исходном коде, полученном из stdin.
Анализ байткода¶
Added in version 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
из заданного traceback, установив current_offset на инструкцию, ответственную за исключение.
- codeobj¶
Объект скомпилированного кода.
- first_line¶
Первая строка исходного кода объекта (если доступна)
- dis()¶
Возвращает форматированное представление операций байткода (то же самое, что выводит
dis.dis()
, но в виде многострочной строки).
- info()¶
Возвращает отформатированную многострочную строку с подробной информацией об объекте кода, например
code_info()
.
Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.
Изменено в версии 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.
Added in version 3.2.
Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.
- dis.show_code(x, *, file=None)¶
Выведите подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в файл (или
sys.stdout
, если файл не указан).Это удобное сокращение для
print(code_info(x), file=file)
, предназначенное для интерактивного изучения в подсказке интерпретатора.Added in version 3.2.
Изменено в версии 3.4: Добавлен параметр file.
- dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False)¶
Разберите объект x. x может обозначать модуль, класс, метод, функцию, генератор, асинхронный генератор, корутину, объект кода, строку исходного кода или последовательность байт необработанного байткода. Для модуля дизассемблируются все функции. Для класса дизассемблируются все методы (включая методы класса и статические методы). Для объекта кода или последовательности необработанного байткода выводится по одной строке на каждую инструкцию байткода. Он также рекурсивно разбирает вложенные объекты кода. К ним могут относиться выражения-генераторы, вложенные функции, тела вложенных классов и объекты кода, используемые для annotation scopes. Перед дизассемблированием строки сначала компилируются в объекты кода с помощью встроенной функции
compile()
. Если объект не указан, функция дизассемблирует последний отслеженный объект.Разборка записывается в виде текста в указанный аргумент file, если он указан, и в
sys.stdout
в противном случае.Максимальная глубина рекурсии ограничена depth, если только она не равна
None
.depth=0
означает отсутствие рекурсии.Если show_caches имеет значение
True
, эта функция отобразит записи инлайн-кэша, используемые интерпретатором для специализации байткода.Если значение adaptive равно
True
, эта функция будет отображать специализированный байткод, который может отличаться от исходного байткода.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.7: Реализован рекурсивный дизассемблирование и добавлен параметр depth.
Изменено в версии 3.7: Теперь он может работать с объектами coroutine и асинхронными генераторами.
Изменено в версии 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
, он указывает номер строки, который должен быть сообщен для первой строки исходного текста в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.Параметр адаптивный работает так же, как и в
dis()
.Added in version 3.4.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
Изменено в версии 3.13: Параметр show_caches устарел и не имеет никакого значения. Поле cache_info каждой инструкции заполняется независимо от его значения.
- dis.findlinestarts(code)¶
Эта функция генератора использует метод
co_lines()
из code object кода, чтобы найти смещения, которые являются началом строк в исходном коде. Они генерируются в виде пар(offset, lineno)
.Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.
Изменено в версии 3.10: Метод PEP 626 Метод
co_lines()
используется вместо атрибутовco_firstlineno
иco_lnotab
из code object.Изменено в версии 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
(по умолчанию), то будет возвращен максимальный стековый эффект из обоих случаев.Added in version 3.4.
Изменено в версии 3.8: Добавлен параметр прыжок.
Изменено в версии 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
- argval¶
разрешенное значение arg (если есть), иначе
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
объект, содержащий начальное и конечное местоположение, которое охватывается этой инструкцией.
Added in version 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¶
Added in version 3.11.
В настоящее время компилятор Python генерирует следующие инструкции байткода.
Общие указания
В дальнейшем мы будем обозначать стек интерпретатора как STACK
и описывать операции над ним, как если бы это был список Python. Вершина стека в этом языке соответствует STACK[-1]
.
- NOP¶
Код «ничего не делать». Используется в качестве заполнителя оптимизатором айтекода и для генерации событий трассировки строк.
- POP_TOP¶
Удаляет верхний элемент стека:
STACK.pop()
- END_FOR¶
Удаляет верхний элемент стека. Эквивалентно
POP_TOP
. Используется для очистки в конце циклов, отсюда и название.Added in version 3.12.
- END_SEND¶
Реализует
del STACK[-2]
. Используется для очистки при выходе генератора.Added in version 3.12.
- COPY(i)¶
Переместите i-й элемент на вершину стопки, не снимая его с исходного места:
assert i > 0 STACK.append(STACK[-i])
Added in version 3.11.
- SWAP(i)¶
Поменяйте верхнюю часть стека на i-й элемент:
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
Added in version 3.11.
- CACHE¶
Этот опкод не является инструкцией, а используется для разметки дополнительного места, чтобы интерпретатор мог кэшировать полезные данные непосредственно в самом байткоде. Он автоматически скрывается всеми утилитами
dis
, но может быть просмотрен с помощьюshow_caches=True
.Логически это пространство является частью предшествующей инструкции. Многие опкоды ожидают, что за ними последует точное количество кэшей, и предписывают интерпретатору пропустить их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует быть очень осторожным при чтении или модификации необработанного, адаптивного байткода, содержащего ускоренные данные.
Added in version 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]
является объектом generator iterator или coroutine, он оставляется как есть. В противном случае реализуетсяSTACK[-1] = iter(STACK[-1])
.Added in version 3.5.
- TO_BOOL¶
Реализует
STACK[-1] = bool(STACK[-1])
.Added in version 3.13.
Двоичные операции и операции с местами.
Бинарные операции удаляют два верхних элемента из стека (STACK[-1]
и STACK[-2]
). Они выполняют операцию, а затем помещают результат обратно в стек.
Операции in-place похожи на бинарные операции, но операция выполняется in-place, если STACK[-2]
поддерживает ее, а результирующий STACK[-1]
может быть (но не обязан быть) исходным STACK[-2]
.
- BINARY_OP(op)¶
Реализует бинарные и in-place операторы (в зависимости от значения op):
rhs = STACK.pop() lhs = STACK.pop() STACK.append(lhs op rhs)
Added in version 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])
Added in version 3.12.
- STORE_SLICE¶
Орудия:
end = STACK.pop() start = STACK.pop() container = STACK.pop() values = STACK.pop() container[start:end] = value
Added in version 3.12.
Открытые коды программ.
- GET_AWAITABLE(where)¶
Реализует
STACK[-1] = get_awaitable(STACK[-1])
, гдеget_awaitable(o)
возвращаетo
, еслиo
является объектом coroutine или объектом генератора с флагомCO_ITERABLE_COROUTINE
, или разрешаетo.__await__
.Если операнд
where
ненулевой, он указывает место выполнения команды:1
: После вызова__aenter__
2
: После вызова__aexit__
Added in version 3.5.
Изменено в версии 3.11: Ранее эта инструкция не имела oparg.
- GET_AITER¶
Реализует
STACK[-1] = STACK[-1].__aiter__()
.Added in version 3.5.
Изменено в версии 3.7: Возврат ожидаемых объектов из
__aiter__
больше не поддерживается.
- GET_ANEXT¶
Внесите
STACK.append(get_awaitable(STACK[-1].__anext__()))
в стек. Подробности оget_awaitable
см. в разделеGET_AWAITABLE
.Added in version 3.5.
- END_ASYNC_FOR¶
Завершает цикл
async for
. Обрабатывает исключение, возникшее при ожидании следующего элемента. Стек содержит асинхронный итерируемый элемент вSTACK[-2]
и поднятое исключение вSTACK[-1]
. Оба они вытаскиваются. Если исключение не находится вStopAsyncIteration
, оно поднимается повторно.Added in version 3.8.
Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не трех элементов.
- CLEANUP_THROW¶
Обрабатывает исключение, возникшее во время вызова
throw()
илиclose()
в текущем кадре. ЕслиSTACK[-1]
является экземпляромStopIteration
, извлеките из стека три значения и вставьте его членvalue
. В противном случае повторно поднимитеSTACK[-1]
.Added in version 3.12.
- BEFORE_ASYNC_WITH¶
Решает
__aenter__
и__aexit__
изSTACK[-1]
. Перемещает__aexit__
и результат__aenter__()
в стек:STACK.extend((__aexit__, __aenter__())
Added in version 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)
Используется для реализации вычислений dict.
Added in version 3.1.
Изменено в версии 3.8: Значение карты -
STACK[-1]
, а ключ карты -STACK[-2]
. Раньше эти значения были обратными.
Для всех инструкций SET_ADD
, LIST_APPEND
и MAP_ADD
, пока добавленное значение или пара ключ/значение выводится из цикла, объект-контейнер остается в стеке, чтобы быть доступным для последующих итераций цикла.
- RETURN_VALUE¶
Возвращает
STACK[-1]
вызывающему функцию.
- RETURN_CONST(consti)¶
Возвращает
co_consts[consti]
вызывающему функцию.Added in version 3.12.
- YIELD_VALUE¶
Из generator получается
STACK.pop()
.Изменено в версии 3.11: oparg задает глубину стека.
Изменено в версии 3.12: oparg - глубина блока исключений для эффективного закрытия генераторов.
Изменено в версии 3.13: oparg имеет значение
1
, если эта инструкция является частью команды yield-from или await, и0
в противном случае.
- SETUP_ANNOTATIONS¶
Проверяет, определен ли
__annotations__
вlocals()
, если нет, то устанавливается в пустойdict
. Этот опкод выдается только в том случае, если тело класса или модуля статически содержит variable annotations.Added in version 3.6.
- POP_EXCEPT¶
Вытаскивает из стека значение, которое используется для восстановления состояния исключения.
Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не трех элементов.
- RERAISE¶
Повторно поднимает исключение, находящееся на вершине стека. Если oparg ненулевое, извлекает из стека дополнительное значение, которое используется для установки
f_lasti
текущего кадра.Added in version 3.9.
Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не трех элементов.
- PUSH_EXC_INFO¶
Вытаскивает значение из стека. Выталкивает текущее исключение на вершину стека. Возвращает в стек первоначально выгруженное значение. Используется в обработчиках исключений.
Added in version 3.11.
- CHECK_EXC_MATCH¶
Выполняет сопоставление исключений для
except
. Проверяет, является лиSTACK[-2]
исключением, соответствующимSTACK[-1]
. ВыбрасываетSTACK[-1]
и вставляет булевский результат проверки.Added in version 3.11.
- CHECK_EG_MATCH¶
Выполняет сопоставление исключений для
except*
. Применяетsplit(STACK[-1])
к группе исключений, представляющихSTACK[-2]
.В случае совпадения вынимает два элемента из стека и вставляет не совпадающую подгруппу (
None
в случае полного совпадения), за которой следует совпадающая подгруппа. Если совпадения нет, вынимается один элемент (тип совпадения) и выталкиваетсяNone
.Added in version 3.11.
- WITH_EXCEPT_START¶
Вызывает функцию в позиции 4 на стеке с аргументами (type, val, tb), представляющими исключение на вершине стека. Используется для реализации вызова
context_manager.__exit__(*exc_info())
, когда исключение произошло в оператореwith
.Added in version 3.9.
Изменено в версии 3.11: Функция
__exit__
находится в позиции 4 стека, а не 7. Представление исключений в стеке теперь состоит из одного, а не трех элементов.
- LOAD_COMMON_CONSTANT¶
Заносит в стек обычную константу. Интерпретатор содержит жестко закодированный список констант, поддерживаемых этой инструкцией. Используется оператором
assert
для загрузкиAssertionError
.Added in version 3.14.
- LOAD_BUILD_CLASS¶
Помещает
builtins.__build_class__()
в стек. Позже он будет вызван для создания класса.
- BEFORE_WITH¶
Этот опкод выполняет несколько операций перед запуском блока with. Во-первых, он загружает
__exit__()
из менеджера контекста и помещает его в стек для последующего использованияWITH_EXCEPT_START
. Затем вызывается__enter__()
. Наконец, в стек помещается результат вызова метода__enter__()
.Added in version 3.11.
- GET_LEN¶
Выполнить
STACK.append(len(STACK[-1]))
.Added in version 3.10.
- MATCH_MAPPING¶
Если
STACK[-1]
является экземпляромcollections.abc.Mapping
(или, более технично: если в егоtp_flags
установлен флагPy_TPFLAGS_MAPPING
), поместитеTrue
в стек. В противном случае занеситеFalse
.Added in version 3.10.
- MATCH_SEQUENCE¶
Если
STACK[-1]
является экземпляромcollections.abc.Sequence
и не является экземпляромstr
/bytes
/bytearray
(или, более технично: если в егоtp_flags
установлен флагPy_TPFLAGS_SEQUENCE
), поместитеTrue
в стек. В противном случае занеситеFalse
.Added in version 3.10.
- MATCH_KEYS¶
STACK[-1]
- кортеж ключей отображения, аSTACK[-2]
- субъект соответствия. ЕслиSTACK[-2]
содержит все ключи изSTACK[-1]
, вставьтеtuple
, содержащий соответствующие значения. В противном случае вставьтеNone
.Added in version 3.10.
Изменено в версии 3.11: Ранее эта инструкция также передавала булево значение, указывающее на успех (
True
) или неудачу (False
).
- STORE_NAME(namei)¶
Реализует
name = STACK.pop()
. namei - это индекс name в атрибутеco_names
из code object. Компилятор старается использоватьSTORE_FAST
илиSTORE_GLOBAL
, если это возможно.
- DELETE_NAME(namei)¶
Реализует
del name
, где namei - индекс атрибутаco_names
в code object.
- 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
из code object.
- DELETE_ATTR(namei)¶
Орудия:
obj = STACK.pop() del obj.name
где namei - индекс имени в
co_names
из code object.
- STORE_GLOBAL(namei)¶
Работает как
STORE_NAME
, но сохраняет имя как глобальное.
- DELETE_GLOBAL(namei)¶
Работает как
DELETE_NAME
, но удаляет глобальное имя.
- LOAD_CONST(consti)¶
Перемещает
co_consts[consti]
в стек.
- LOAD_NAME(namei)¶
Перемещает значение, связанное с
co_names[namei]
, в стек. Имя ищется в locals, затем в globals, затем в builtins.
- LOAD_LOCALS¶
Выносит в стек ссылку на словарь locals. Это используется для подготовки словарей пространств имен для
LOAD_FROM_DICT_OR_DEREF
иLOAD_FROM_DICT_OR_GLOBALS
.Added in version 3.12.
- LOAD_FROM_DICT_OR_GLOBALS(i)¶
Выгружает отображение из стека и ищет значение для
co_names[namei]
. Если имя там не найдено, оно ищется в глобальных переменных, а затем во встроенных, аналогичноLOAD_GLOBAL
. Это используется для загрузки глобальных переменных в annotation scopes внутри тел классов.Added in version 3.12.
- BUILD_TUPLE(count)¶
Создает кортеж, потребляющий count элементов из стека, и помещает полученный кортеж в стек.:
assert count > 0 STACK, values = STACK[:-count], STACK[-count:] STACK.append(tuple(values))
- BUILD_LIST(count)¶
Работает как
BUILD_TUPLE
, но создает список.
- BUILD_SET(count)¶
Работает как
BUILD_TUPLE
, но создает набор.
- BUILD_MAP(count)¶
Выталкивает новый объект словаря в стек. Размещает элементы
2 * count
так, чтобы словарь содержал количество записей:{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}
.Изменено в версии 3.5: Словарь создается из элементов стека вместо того, чтобы создавать пустой словарь, заранее рассчитанный на количество элементов.
- BUILD_CONST_KEY_MAP(count)¶
Версия
BUILD_MAP
, специализированная для константных ключей. Вытаскивает верхний элемент стека, содержащий кортеж ключей, затем, начиная сSTACK[-2]
, вытаскивает count значений для формирования значений в построенном словаре.Added in version 3.6.
- BUILD_STRING(count)¶
Конкатенирует count строк из стека и помещает полученную строку в стек.
Added in version 3.6.
- LIST_EXTEND(i)¶
Орудия:
seq = STACK.pop() list.extend(STACK[-i], seq)
Используется для создания списков.
Added in version 3.9.
- SET_UPDATE(i)¶
Орудия:
seq = STACK.pop() set.update(STACK[-i], seq)
Используется для создания наборов.
Added in version 3.9.
- DICT_UPDATE(i)¶
Орудия:
map = STACK.pop() dict.update(STACK[-i], map)
Используется для построения диаграмм.
Added in version 3.9.
- DICT_MERGE(i)¶
Как и
DICT_UPDATE
, но вызывает исключение для дублирующихся ключей.Added in version 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()
(если он не установлен, значит, нуль-аргументный).Added in version 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.Added in version 3.9.
- CONTAINS_OP(invert)¶
Выполняет сравнение
in
илиnot in
, еслиinvert
равно 1.Added in version 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)¶
Увеличивает счетчик байткода на дельта.
- JUMP_BACKWARD(delta)¶
Уменьшает счетчик байткода на дельта. Проверяет наличие прерываний.
Added in version 3.11.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
Уменьшает счетчик байткода на дельта. Не проверяет наличие прерываний.
Added in version 3.11.
- POP_JUMP_IF_TRUE(delta)¶
Если
STACK[-1]
равен true, увеличивает счетчик байткода на дельта.STACK[-1]
выводится.Изменено в версии 3.11: Теперь oparg - это относительная дельта, а не абсолютная цель. Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде направленными версиями (вперед/назад).
Изменено в версии 3.12: Это больше не псевдоинструкция.
Изменено в версии 3.13: Теперь эта инструкция требует точного операнда
bool
.
- POP_JUMP_IF_FALSE(delta)¶
Если
STACK[-1]
равно false, увеличивает счетчик байткода на дельта.STACK[-1]
выводится.Изменено в версии 3.11: Теперь oparg - это относительная дельта, а не абсолютная цель. Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде направленными версиями (вперед/назад).
Изменено в версии 3.12: Это больше не псевдоинструкция.
Изменено в версии 3.13: Теперь эта инструкция требует точного операнда
bool
.
- POP_JUMP_IF_NOT_NONE(delta)¶
Если
STACK[-1]
не являетсяNone
, увеличивает счетчик байткода на дельта.STACK[-1]
выводится на экран.Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде на направленные версии (вперед/назад).
Added in version 3.11.
Изменено в версии 3.12: Это больше не псевдоинструкция.
- POP_JUMP_IF_NONE(delta)¶
Если
STACK[-1]
равноNone
, увеличивает счетчик байткода на дельта.STACK[-1]
выводится на экран.Этот опкод является псевдоинструкцией, заменяемой в конечном байткоде на направленные версии (вперед/назад).
Added in version 3.11.
Изменено в версии 3.12: Это больше не псевдоинструкция.
- FOR_ITER(delta)¶
STACK[-1]
является iterator. Вызовите его метод__next__()
. Если в результате будет получено новое значение, поместите его в стек (оставив итератор под ним). Если итератор показывает, что он исчерпан, то счетчик байт-кода увеличивается на дельта.Изменено в версии 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_CHECK(var_num)¶
Помещает ссылку на локальную переменную
co_varnames[var_num]
в стек, поднимая сообщениеUnboundLocalError
, если локальная переменная не была инициализирована.Added in version 3.12.
- LOAD_FAST_AND_CLEAR(var_num)¶
Помещает ссылку на локальную переменную
co_varnames[var_num]
в стек (или помещаетNULL
в стек, если локальная переменная не была инициализирована) и устанавливаетco_varnames[var_num]
вNULL
.Added in version 3.12.
- STORE_FAST(var_num)¶
Записывает
STACK.pop()
в локальныйco_varnames[var_num]
.
- DELETE_FAST(var_num)¶
Удаляет локальные
co_varnames[var_num]
.
- MAKE_CELL(i)¶
Создает новую ячейку в слоте
i
. Если этот слот непустой, то значение сохраняется в новой ячейке.Added in version 3.11.
- LOAD_DEREF(i)¶
Загружает ячейку, содержащуюся в слоте
i
хранилища «быстрых локалей». Помещает ссылку на объект, содержащийся в ячейке, в стек.Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- LOAD_FROM_DICT_OR_DEREF(i)¶
Выгружает отображение из стека и ищет в этом отображении имя, связанное со слотом
i
хранилища «быстрых локалей». Если имя там не найдено, загружает его из ячейки, содержащейся в слотеi
, аналогичноLOAD_DEREF
. Это используется для загрузки свободных переменных в телах классов (которые ранее использовалиLOAD_CLASSDEREF
) и в annotation scopes внутри тел классов.Added in version 3.12.
- STORE_DEREF(i)¶
Записывает
STACK.pop()
в ячейку, содержащуюся в слотеi
хранилища «быстрых локалей».Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- DELETE_DEREF(i)¶
Опустошает ячейку, содержащуюся в слоте
i
, из хранилища «быстрых локалей». Используется операторомdel
.Added in version 3.2.
Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- COPY_FREE_VARS(n)¶
Копирует свободные переменные
n
из закрытия во фрейм. Устраняет необходимость в специальном коде на стороне вызывающей стороны при вызове закрытий.Added in version 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]
)
- CALL(argc)¶
Вызывает вызываемый объект с количеством аргументов, указанных
argc
. В стеке находятся (в порядке возрастания):Вызываемый
self
илиNULL
Остальные позиционные аргументы
argc
- это сумма позиционных аргументов, исключаяself
.CALL
выгружает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и вставляет возвращаемое вызываемым объектом значение.Added in version 3.11.
Изменено в версии 3.13: Теперь вызываемый объект всегда находится в одной и той же позиции на стеке.
Изменено в версии 3.13: Вызовы с аргументами в виде ключевых слов теперь обрабатываются
CALL_KW
.
- CALL_KW(argc)¶
Вызывает вызываемый объект с количеством аргументов, указанных
argc
, включая один или несколько именованных аргументов. В стеке находятся (в порядке возрастания):Вызываемый
self
илиNULL
Остальные позиционные аргументы
Именованные аргументы
Список
tuple
имен аргументов ключевых слов
argc
- это сумма позиционных и именованных аргументов, исключаяself
. Длина кортежа имен аргументов ключевых слов равна количеству именованных аргументов.CALL_KW
выгружает из стека все аргументы, имена ключевых слов и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращенное вызываемым объектом.Added in version 3.13.
- CALL_FUNCTION_EX(flags)¶
Вызывает вызываемый объект с переменным набором позиционных и ключевых аргументов. Если младший бит flags установлен, то в верхней части стека находится объект отображения, содержащий дополнительные аргументы в виде ключевых слов. Перед вызовом вызываемого объекта объект отображения и объект iterable «распаковываются», а их содержимое передается в качестве ключевых и позиционных аргументов соответственно.
CALL_FUNCTION_EX
снимает со стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает возвращаемое вызываемым объектом значение.Added in version 3.6.
- PUSH_NULL¶
Вставляет
NULL
в стек. Используется в последовательности вызовов для соответствияNULL
, выталкиваемомуLOAD_METHOD
для вызовов, не относящихся к методам.Added in version 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
кортеж, содержащий ячейки для свободных переменных, образуя замыкание
Added in version 3.13.
- BUILD_SLICE(argc)¶
Помещает объект slice в стек. argc должен быть равен 2 или 3. Если 2, то реализуется:
end = STACK.pop() start = STACK.pop() STACK.append(slice(start, stop))
если оно равно 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()
на значение.oparg == 2
: вызовrepr()
на значение.oparg == 3
: вызовascii()
на значение.
Используется для реализации форматированных литеральных строк (f-строк).
Added in version 3.13.
- FORMAT_SIMPLE¶
Форматирует значение на вершине стека:
value = STACK.pop() result = value.__format__("") STACK.append(result)
Используется для реализации форматированных литеральных строк (f-строк).
Added in version 3.13.
- FORMAT_SPEC¶
Форматирует заданное значение с заданным форматом spec:
spec = STACK.pop() value = STACK.pop() result = value.__format__(spec) STACK.append(result)
Используется для реализации форматированных литеральных строк (f-строк).
Added in version 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
.Added in version 3.10.
Изменено в версии 3.11: Ранее эта инструкция также передавала булево значение, указывающее на успех (
True
) или неудачу (False
).
- RESUME(context)¶
Не работает. Выполняет внутреннюю трассировку, отладку и проверку оптимизации.
Опаранд
context
состоит из двух частей. Младшие два бита указывают, где находитсяRESUME
:0
Начало функции, которая не является ни генератором, ни coroutine, ни async-генератором1
После выраженияyield
2
После выраженияyield from
3
После выраженияawait
Следующим битом будет
1
, если RESUME находится на исключительном шаге1
, и0
в противном случае.Added in version 3.11.
Изменено в версии 3.13: Значение oparg изменилось, чтобы включить информацию об исключении глубины
- RETURN_GENERATOR¶
Создает генератор, coroutine или async-генератор из текущего кадра. Используется в качестве первого опкода объекта in code для вышеупомянутых вызываемых элементов. Очистите текущий кадр и верните только что созданный генератор.
Added in version 3.11.
- SEND(delta)¶
Эквивалент
STACK[-1] = STACK[-2].send(STACK[-1])
. Используется в операторахyield from
иawait
.Если вызов поднимает
StopIteration
, извлеките верхнее значение из стека, вставьте атрибутvalue
исключения и увеличьте счетчик байткода на delta.Added in version 3.11.
- HAVE_ARGUMENT¶
На самом деле это не совсем опкод. Он определяет разделительную линию между опкодами в диапазоне [0,255], которые не используют свой аргумент, и теми, которые используют (
< HAVE_ARGUMENT
и>= HAVE_ARGUMENT
, соответственно).Если в вашем приложении используются псевдоинструкции или специализированные инструкции, используйте вместо них коллекцию
hasarg
.Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды
< HAVE_ARGUMENT
его игнорируют. Раньше аргумент был только у опкодов>= HAVE_ARGUMENT
.Изменено в версии 3.12: Псевдоинструкции были добавлены в модуль
dis
, и для них не верно, что сравнение сHAVE_ARGUMENT
показывает, используют ли они свой arg.Не рекомендуется, начиная с версии 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
Обертывание значения генератора aync
INTRINSIC_UNARY_POSITIVE
Выполняет унарную операцию
+
.INTRINSIC_LIST_TO_TUPLE
Преобразует список в кортеж
INTRINSIC_TYPEVAR
Создает
typing.TypeVar
INTRINSIC_PARAMSPEC
Создает
typing.ParamSpec
INTRINSIC_TYPEVARTUPLE
Создает
typing.TypeVarTuple
INTRINSIC_SUBSCRIPT_GENERIC
Возвращает
typing.Generic
, подписанный аргументомINTRINSIC_TYPEALIAS
Создает псевдоним
typing.TypeAliasType
; используется в оператореtype
. Аргументом является кортеж из имени псевдонима типа, параметров типа и значения.Added in version 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__
функции.Added in version 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
с установленным флагом в arg.
Коллекции опкодов¶
Эти коллекции предназначены для автоматической интроспекции инструкций байткода:
Изменено в версии 3.12: Коллекции теперь содержат псевдоинструкции и инструментальные инструкции. Это опкоды со значениями >= MIN_PSEUDO_OPCODE
и >= MIN_INSTRUMENTED_OPCODE
.
- dis.opname¶
Последовательность имен операций, индексируемых с помощью байткода.
- dis.opmap¶
Словарь, отображающий имена операций на байткоды.
- dis.cmp_op¶
Последовательность имен всех операций сравнения.
- dis.hasarg¶
Последовательность байткодов, использующих свой аргумент.
Added in version 3.12.
- dis.hasconst¶
Последовательность байткодов, обращающихся к константе.
- dis.hasfree¶
Последовательность байткодов, обращающихся к свободной переменной. „Свободная“ в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости или имена во внешних областях видимости, на которые ссылаются из этой области видимости. Он не включает ссылки на глобальные или встроенные области видимости.
- dis.hasname¶
Последовательность байткодов, обращающихся к атрибуту по имени.
- dis.hasjump¶
Последовательность байткодов, имеющих цель перехода. Все переходы являются относительными.
Added in version 3.13.
- dis.haslocal¶
Последовательность байткодов, обращающихся к локальной переменной.
- dis.hascompare¶
Последовательность байткодов булевых операций.
- dis.hasexc¶
Последовательность байткодов, устанавливающих обработчик исключений.
Added in version 3.12.
- dis.hasjrel¶
Последовательность байткодов, имеющих относительную цель перехода.
Не рекомендуется, начиная с версии 3.13: Все переходы теперь относительные. Используйте
hasjump
.
- dis.hasjabs¶
Последовательность байткодов, имеющих абсолютную цель перехода.
Не рекомендуется, начиная с версии 3.13: Все переходы теперь относительные. Этот список пуст.