dis
— Дизассемблер для Python байткода¶
Исходный код: Lib/dis.py
Модуль dis
поддерживает анализ CPython байткода и его дизассемблирование.
CPython байткод, принимаемый на входе этого модуля, определен в
файле Include/opcode.h
и используется компилятором и интерпретатором.
Детали реализации CPython: Байткод является детализированной реализацией CPython интерпретатора. Нет гарантий, что байткод не будет добавлен, удален или изменен между версиями Python. Использование этого модуля не должно рассматриваться работой через Python VM или Python выпуски.
Изменено в версии 3.6: Используется 2 байта для каждой команды. Ранее количество байтов варьировалось в зависимости от команды.
Пример. Препарирование функции myfunc()
:
def myfunc(alist):
return len(alist)
следующая команда демонстрирует дизассемблированную myfunc()
:
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_FAST 0 (alist)
4 CALL_FUNCTION 1
6 RETURN_VALUE
(«2» - номер строки).
Анализ Bytecode¶
Добавлено в версии 3.4.
API анализа байт-кодов позволяет упаковывать части Python кода в
объект Bytecode
, который предоставляет простой доступ к подробностям
скомпилированного кода.
-
class
dis.
Bytecode
(x, *, first_line=None, current_offset=None)¶ Проанализировать байт-код соответствующих функций, генераторов, асинхронных генераторов, сопрограмм, методов, строк исходников кода или объекта кода (как возвращенный
compile()
).Это удобная обертка вокруг многих функций, перечисленных ниже, особенно
get_instructions()
, так как итерация поBytecode
сущности возвращает операции байт-кода какInstruction
сущности.Если first_line не является
None
, он указывает номер строки, которая должна быть указана для первой исходной строки в демонтированном коде. В противном случае информация об исходной строке (при ее наличии) берется непосредственно из демонтированного объекта кода.Если current_offset не является
None
, это относится к смещению инструкции в демонтированном коде. Этого настройка означает, чтоdis()
покажет маркер «текущей команды» против указанного opcode.-
classmethod
from_traceback
(tb)¶ Создать
Bytecode
сущность из данного трейсбэка, установив current_offset в инструкцию, ответственную за исключение.
-
codeobj
¶ Скомпилированный объект кода.
-
first_line
¶ Первая исходная строка объекта кода (если доступна)
-
dis
()¶ Возвращает форматированное представление операций байт-кода (то же самое, что распечатывает
dis.dis()
, но возвращает многострочную строку).
-
info
()¶ Возвращает отформатированную многострочную строку с подробной информацией об объекте кода, например
code_info()
.
Изменено в версии 3.7: Может теперь обращаться к корутинам и асинхронными генераторам объектов.
-
classmethod
Пример:
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
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)¶ Дизассемблировать объект x. x может быть либо модулем, классом, методом, функцией, генератором, асинхронным генератором, корутиной, объектом кода, строка исходного кода или последовательность байтов исходного байт-кода. Для модуля выполняется дизассемблирование всех функций. Для класса он дизассемблирует все методы (включая методы класса и статические методы). Для объекта код или последовательности необработанных байт-кодов он печатает одну строку на каждую команду байт-кода. Он также рекурсивно дизассемблирует вложенные объекты кода (код компрехэншенов, генераторов выражений и вложенных функций, а также код используемый для построения вложенных классов). Перед дизассемблированием строк они сначала компилируются в кодовые объекты встроенной функцией
compile()
. Если никакой объект не предоставлен, эта функция дизассемблирует последний трейсбэк.Дизассемблирование записывается как текст поставляемому аргументу file, если предоставлен и
sys.stdout
иначе.Максимальная глубина рекурсии ограничена depth, если она не является
None
.depth=0
означает отсутствие рекурсии.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.7: Реализовано рекурсивное дизассемблирование и добавлен параметр depth.
Изменено в версии 3.7: Теперь может обрабатывать корутины и асинхронные объекты генераторов.
-
dis.
distb
(tb=None, *, file=None)¶ Дизассемблировать функцию вершины стека трейсбэка, используя последний трейсбэк, если ни один не был передан. Указывается инструкция, вызывающая исключение.
Дизассемблирование записывается как текст поставляемому аргументу file, если предоставлен и
sys.stdout
иначе.Изменено в версии 3.4: Добавлен параметр file.
-
dis.
disassemble
(code, lasti=-1, *, file=None)¶ -
dis.
disco
(code, lasti=-1, *, file=None)¶ Дизассемблировать объект кода, указав на последнюю инструкцию, если lasti был предоставлен. Выходные данные делятся на следующие столбцы:
- номер строки для первой команды каждой строки
- текущую инструкцию, обозначенную как
-->
- маркированная инструкция, обозначенная
>>
- адрес инструкции
- имя кода операции
- рабочие параметры и
- интерпретация параметров в скобках.
Интерпретация параметров распознает имена локальных и глобальных переменных, константные значения, цели ветвления и операторы сравнения.
Дизассемблирование записывается как текст поставляемому аргументу file, если предоставлен и
sys.stdout
иначе.Изменено в версии 3.4: Добавленный параметр file.
-
dis.
get_instructions
(x, *, first_line=None)¶ Возвращает итератор по инструкциям в предоставленной функции, методу, исходному коду строки или объекту кода.
Итератор производит последовательность
Instruction
именованных кортежей, предоставляющих подробную информацию о каждой операции в предоставляемом коде.Если first_line не является
None
, он указывает номер строки, которая должна быть указана для первой исходной строки в дизассемблированном коде. В противном случае информация об исходной строке (при ее наличии) берется непосредственно из дизассемблированного объекта кода.Добавлено в версии 3.4.
-
dis.
findlinestarts
(code)¶ Функция генератор использующая
co_firstlineno
, иco_lnotab
атрибуты объекта кода code, чтобы найти смещения, которые являются началом строк в исходном коде. Они генерируются как пары(offset, lineno)
. См. Objects/lnotab_notes.txt для форматаco_lnotab
и как его расшифровать.Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.
-
dis.
findlabels
(code)¶ Обнаружить все смещения в собранном байт-коде сырой строки code, которые являются целями перехода и возвращаемым списком этих смещений.
-
dis.
stack_effect
(opcode, oparg=None, *, jump=None)¶ Вычислить эффект стека opcode с аргументом oparg.
Если у кода будет цель перехода и jump -
True
, тоstack_effect()
будет возвращать переход эффекта стека. Если jump являетсяFalse
, это будет возвращён эффект стека без перехода. И если jump равноNone
(по умолчанию), это будет возвращщен максимальный эффект стека обоих вариантов.Добавлено в версии 3.4.
Изменено в версии 3.8: Добавлен параметр jump.
Инструкции Python байткода¶
Функция get_instructions()
и класс Bytecode
предоставляют подробные сведения о
инструкциях байт-кода как Instruction
сущности:
-
class
dis.
Instruction
¶ Сведения об операциях с байт-кодом
-
opcode
¶ Числовой код для операции, соответствуя упомянутому ниже opcode значениям и значениям байт-кода в Коллекции Opcode.
-
opname
¶ Читаемое человеком имя для эксплуатации
-
arg
¶ числовой аргумент к операции (если имеется), в противном случае
None
-
argval
¶ разрешенное arg значение (если известен), иначе такое же, как arg
-
argrepr
¶ читаемое человеком описание аргумента операции
-
offset
¶ начальный индекс операции в последовательности байт-кодов
-
starts_line
¶ строка, запущенная этим кодом операции (если имеется), в противном случае
None
-
is_jump_target
¶ True
если другой код переходит сюда, в противном случаеFalse
Добавлено в версии 3.4.
-
Компилятор Python в настоящее время генерирует следующие команды байт-кода.
Основные инструкции
-
NOP
¶ Ничего не делающий код. Используется в качестве местозаполнителя оптимизатором байт-кодов.
-
POP_TOP
¶ Удаляет верхний элемент из стэка (TOS).
-
ROT_TWO
¶ Замена двух самых верхних элементов стека.
-
ROT_THREE
¶ Поднимает второй и третий элемент стека на одну позицию вверх, перемещает сверху вниз в позицию три.
-
ROT_FOUR
¶ Поднимает второй, третий и четвертый элементы стэка на одну позицию вверх, перемещаясь сверху вниз в позицию четыре.
Добавлено в версии 3.8.
-
DUP_TOP
¶ Дублирует ссылку верхней части стека.
Добавлено в версии 3.2.
-
DUP_TOP_TWO
¶ Дублирует две ссылки вершины стека, оставляя их в том же порядке.
Добавлено в версии 3.2.
Унарные операции
Унарные операции принимают вершину стека, применяют операцию и вталкивают результат в стек.
-
UNARY_POSITIVE
¶ Реализует
TOS = +TOS
.
-
UNARY_NEGATIVE
¶ Реализует
TOS = -TOS
.
-
UNARY_NOT
¶ Реализует
TOS = not TOS
.
-
UNARY_INVERT
¶ Реализует
TOS = ~TOS
.
-
GET_ITER
¶ Реализует
TOS = iter(TOS)
.
-
GET_YIELD_FROM_ITER
¶ Если
TOS
является объектом генератор итератора или корутиной, он остается как есть. В противном случае реализуетTOS = iter(TOS)
.Добавлено в версии 3.5.
Бинарные операции
Двоичные операции удаляют вершину стека (TOS) и второй самый верхний элемент стека (TOS1) из стека. Они выполняют операцию и помещают результат обратно в стек.
-
BINARY_POWER
¶ Реализует
TOS = TOS1 ** TOS
.
-
BINARY_MULTIPLY
¶ Реализует
TOS = TOS1 * TOS
.
-
BINARY_MATRIX_MULTIPLY
¶ Реализует
TOS = TOS1 @ TOS
.Добавлено в версии 3.5.
-
BINARY_FLOOR_DIVIDE
¶ Реализует
TOS = TOS1 // TOS
.
-
BINARY_TRUE_DIVIDE
¶ Реализует
TOS = TOS1 / TOS
.
-
BINARY_MODULO
¶ Реализует
TOS = TOS1 % TOS
.
-
BINARY_ADD
¶ Реализует
TOS = TOS1 + TOS
.
-
BINARY_SUBTRACT
¶ Реализует
TOS = TOS1 - TOS
.
-
BINARY_SUBSCR
¶ Реализует
TOS = TOS1[TOS]
.
-
BINARY_LSHIFT
¶ Реализует
TOS = TOS1 << TOS
.
-
BINARY_RSHIFT
¶ Реализует
TOS = TOS1 >> TOS
.
-
BINARY_AND
¶ Реализует
TOS = TOS1 & TOS
.
-
BINARY_XOR
¶ Реализует
TOS = TOS1 ^ TOS
.
-
BINARY_OR
¶ Реализует
TOS = TOS1 | TOS
.
Операции на месте
Операции на месте подобны двоичным операциям, поскольку они удаляют TOS и TOS1 и вталкивают результат в стек, но операция выполняется на месте, когда TOS1 поддерживает его, и результирующий TOS может быть (но не обязательно должен быть) исходным TOS1.
-
INPLACE_POWER
¶ Реализует
TOS = TOS1 ** TOS
на месте.
-
INPLACE_MULTIPLY
¶ Реализует
TOS = TOS1 * TOS
на месте.
-
INPLACE_MATRIX_MULTIPLY
¶ Реализует
TOS = TOS1 @ TOS
на месте.Добавлено в версии 3.5.
-
INPLACE_FLOOR_DIVIDE
¶ Реализует
TOS = TOS1 // TOS
на месте.
-
INPLACE_TRUE_DIVIDE
¶ Реализует
TOS = TOS1 / TOS
на месте.
-
INPLACE_MODULO
¶ Реализует
TOS = TOS1 % TOS
на месте.
-
INPLACE_ADD
¶ Реализует
TOS = TOS1 + TOS
на месте.
-
INPLACE_SUBTRACT
¶ Реализует
TOS = TOS1 - TOS
на месте.
-
INPLACE_LSHIFT
¶ Реализует
TOS = TOS1 << TOS
на месте.
-
INPLACE_RSHIFT
¶ Реализует
TOS = TOS1 >> TOS
на месте.
-
INPLACE_AND
¶ Реализует
TOS = TOS1 & TOS
на месте.
-
INPLACE_XOR
¶ Реализует
TOS = TOS1 ^ TOS
на месте.
-
INPLACE_OR
¶ Реализует
TOS = TOS1 | TOS
на месте.
-
STORE_SUBSCR
¶ Реализует
TOS1[TOS] = TOS2
.
-
DELETE_SUBSCR
¶ Реализует
del TOS1[TOS]
.
Опкоды корутин
-
GET_AWAITABLE
¶ Реализует
TOS = get_awaitable(TOS)
, гдеget_awaitable(o)
возвращаетo
, еслиo
является объектом корутиной или объектом генератором с флагом CO_ITERABLE_COROUTINE или разрешаетo.__await__
.Добавлено в версии 3.5.
-
GET_AITER
¶ Реализует
TOS = TOS.__aiter__()
.Добавлено в версии 3.5.
Изменено в версии 3.7: Возвращение awaitable объектов из
__aiter__
больше не поддерживается.
-
GET_ANEXT
¶ Реализует
PUSH(get_awaitable(TOS.__anext__()))
. См.GET_AWAITABLE
для получения дополнительной информации оget_awaitable
Добавлено в версии 3.5.
-
END_ASYNC_FOR
¶ Завершение цикла
async for
. Обрабатывает исключение, возникшее при ожидании следующего элемента. Если TOS - этоStopAsyncIteration
выталкивает 7 значений из стека и восстанавливает состояние исключения с помощью второй тройки из них. В противном случае повторно вызывается исключение, используя три значения из стека. Блок обработчика исключений удален из блоков стека.Добавлено в версии 3.8.
-
BEFORE_ASYNC_WITH
¶ Разрешение
__aenter__
и__aexit__
из объекта вершины стека. Вталкивает__aexit__
и результат__aenter__()
в стек.Добавлено в версии 3.5.
-
SETUP_ASYNC_WITH
¶ Создание нового объекта фрейма.
Добавлено в версии 3.5.
Различные опкоды
-
PRINT_EXPR
¶ Реализует выражение инструкции для интерактивного режима. TOS удаляется из стека и печатается. В неинтерактивном режиме выражение инструкции завершается символом
POP_TOP
.
-
SET_ADD
(i)¶ Вызов
set.add(TOS1[-i], TOS)
. Используется для реализации компрехэншэнов множества.
-
LIST_APPEND
(i)¶ Вызов
list.append(TOS1[-i], TOS)
. Используется для реализации компрехэншэнов списков.
-
MAP_ADD
(i)¶ Вызов
dict.__setitem__(TOS1[-i], TOS1, TOS)
. Используется для реализации компрехэншэнов словарей.Добавлено в версии 3.1.
Изменено в версии 3.8: Карта значение - TOS, и ключ карты - TOS1. Раньше они были отменены.
Для всех инструкций SET_ADD
, LIST_APPEND
и MAP_ADD
, пока добавленное значение или пара ключ/значение выталкиваются, объект контейнера остается в стеке, так что он доступен для дальнейшего использования в итерации цикла.
-
RETURN_VALUE
¶ Возвращает TOS вызывающей функции.
-
YIELD_VALUE
¶ Выталкивает TOS и возвращает его из генератора.
-
YIELD_FROM
¶ Выталкивает TOS и его делегатов в качестве субитератора из генератора.
Добавлено в версии 3.3.
-
SETUP_ANNOTATIONS
¶ Проверяет, определен ли
__annotations__
вlocals()
, если он не настроен на пустойdict
. Этот opcode только испускается, если тело класса или модуля содержит аннотации переменной статически.Добавлено в версии 3.6.
-
IMPORT_STAR
¶ Загружает все символы, не начинающиеся с
'_'
, непосредственно из TOS модуля в локальное пространство имен. Модуль выталкивается после загрузки всех имен. Этот опкод реализуетfrom module import *
.
-
POP_BLOCK
¶ Удаляет один блок из стека блоков. На фрейм приходится стек блоков, обозначенных
try
инструкцией, и тому подобное.
-
POP_EXCEPT
¶ Удаляет один блок из стека блоков. Выталкиваемый блок должен быть блоком обработчика исключений, который неявно создается при входе в обработчик исключения. В дополнение к выталкиванию посторонних значения из стека фреймов, последние три выталкиваемых значений используются восстановленным состоянием исключения.
-
POP_FINALLY
(preserve_tos)¶ Очищает стек значений и стек блоков. Если preserve_tos не является
0
TOS сначала выталкивается из стека и вталкивается в стек после выполнения других операций на стеке:- Если TOS является
NULL
или целым числом (задаваемымBEGIN_FINALLY
илиCALL_FINALLY
), он выталкивается из стека. - Если TOS является типом исключения (вталкивается, когда было вызвано исключение) 6 значений вытолкнуты из стека, последние три вытолкнутых значений используется для восстановления состояния исключения. Блок обработчика исключений удален из стека блоков.
Он похож на
END_FINALLY
, но не изменяет счетчик байт-кодов и не вызывает исключение. Используется для реализацииbreak
,continue
иreturn
в блокеfinally
.Добавлено в версии 3.8.
- Если TOS является
-
BEGIN_FINALLY
¶ Вталкивает
NULL
на стек для использования вEND_FINALLY
,POP_FINALLY
,WITH_CLEANUP_START
иWITH_CLEANUP_FINISH
. Запуск блокаfinally
.Добавлено в версии 3.8.
-
END_FINALLY
¶ Завершение
finally
клаузулы. Интерпретатор вспоминает, должно ли исключение быть повторно поднято, или выполнение должно быть продолжено в зависимости от значение TOS.- Если TOS является
NULL
(вталкиваетсяBEGIN_FINALLY
), продолжает из следующей команды. Выталкивает TOS. - Если TOS является целым числом (вталкивается
CALL_FINALLY
), устанавливает счетчик байт-кодов в TOS. Выталкивает TOS. - Если TOS является типом исключения (вталкивается, когда было вызвано исключение) 6 значений выталкиваются из стека, первые три вытолкнутых значений используется для повторного вызова исключения, и используются последние три вытолкнутых значения чтобы восстановить состояние исключения. Блок обработчика исключений удаляется из стэка блоков.
- Если TOS является
-
LOAD_BUILD_CLASS
¶ Вталкивает
builtins.__build_class__()
в стек. Позже он вызываетсяCALL_FUNCTION
для построения класса.
-
SETUP_WITH
(delta)¶ Этот опкод выполняет несколько операций перед началом работы с блоком. Во-первых, он загружает
__exit__()
из менеджера контекста и вталкивает его в стек для последующего использованияWITH_CLEANUP_START
. Затем вызывается__enter__()
, и в завершение вталкивается блок, указывающий на delta. Наконец, результат вызова метода__enter__()
помещается в стек. Следующий опкод либо игнорирует его (POP_TOP
), либо сохраняет в переменной(ых) (STORE_FAST
,STORE_NAME
илиUNPACK_SEQUENCE
).Добавлено в версии 3.2.
-
WITH_CLEANUP_START
¶ Начало очистки стека при выходе из блока
with
инструкции.В вершину стека вталкивается либо
NULL
(вталкиваетсяBEGIN_FINALLY
), либо 6 значений, если в блоке with возникло исключение. Ниже__exit__()
менеджера контекст, или__aexit__()
связанного метода.Если TOS является
NULL
, вызываетсяSECOND(None, None, None)
, удаляет функцию из стека, оставляя TOS, и вталкиваетNone
в стек. В противном случае вызываетSEVENTH(TOP, SECOND, THIRD)
, сдвигает вниз нижние 3 значения стека, заменяет пустое место наNULL
и вталкивает TOS. Наконец, вталкивает результат вызова.
-
WITH_CLEANUP_FINISH
¶ Завершение очистки стека при выходе блока
with
инструкции.TOS - результат
__exit__()
или вызова функции__aexit__()
, вталкиваетWITH_CLEANUP_START
. ВТОРОЙNone
или тип исключения (вталкивается, когда исключение было поднято).Выталкивает два значения из стэка. Если ВТОРОЙ не None, и TOS True, раскручивает блок EXCEPT_HANDLER, который был создан, когда исключение было поймано и вталкивает
NULL
в стек.
Все следующие опкоды используют свои аргументы.
-
STORE_NAME
(namei)¶ Реализует
name = TOS
. namei - индекс name в атрибутеco_names
объекта кода. Компилятор пытается использоватьSTORE_FAST
илиSTORE_GLOBAL
, если это возможно.
-
DELETE_NAME
(namei)¶ Реализует
del name
, где namei - индекс вco_names
атрибут объекта кода.
-
UNPACK_SEQUENCE
(count)¶ Распаковывает TOS в индивидуальное значение count, которые помещены в стек справа налево.
-
UNPACK_EX
(counts)¶ Реализует назначение со снятым целевым объектом: распаковывает итератор в TOS на отдельные значения, где общее количество значения может быть меньше, чем количество элементов в итераторе: одним из новых значений будет список всех оставшихся элементов.
Нижний байт counts - это число значений перед списком значения, верхний байт counts - число значения после него. Результирующие значения помещаются в стек справа налево.
-
STORE_ATTR
(namei)¶ Реализует
TOS.name = TOS1
, где namei - индекс имени вco_names
.
-
DELETE_ATTR
(namei)¶ Реализует
del TOS.name
, используя namei в качестве индекса вco_names
.
-
STORE_GLOBAL
(namei)¶ Работает как
STORE_NAME
, но сохраняет имя как глобальное.
-
DELETE_GLOBAL
(namei)¶ Работает как
DELETE_NAME
, но удаляет глобальное имя.
-
LOAD_CONST
(consti)¶ Вталкивает
co_consts[consti]
в стек.
-
LOAD_NAME
(namei)¶ Перемещает значение связанное с
co_names[namei]
в стек.
-
BUILD_TUPLE
(count)¶ Создает кортеж, потребляющий count элементов из стека, и вталкивает полученный кортеж в стек.
-
BUILD_LIST
(count)¶ Работает как
BUILD_TUPLE
, но создает список.
-
BUILD_SET
(count)¶ Работает как
BUILD_TUPLE
, но создает множество.
-
BUILD_MAP
(count)¶ Перемещает новый объект словаря в стек. Вталкивает
2 * count
элементов так, чтобы словарь содержал count записей :{..., TOS3: TOS2, TOS1: TOS}
.Изменено в версии 3.5: Словарь создается из элементов стека вместо того, чтобы создавать пустой словарь, размер которого должен содержать элементы count.
-
BUILD_CONST_KEY_MAP
(count)¶ Версия
BUILD_MAP
специализирована для постоянных клавиш. Всплывает верхний элемент на стек, который содержит кортеж ключей, затем начиная сTOS1
, pops count значения, чтобы сформировать значения в построенном словаре.Добавлено в версии 3.6.
-
BUILD_STRING
(count)¶ Конкатенация count строк из стека и вталкивание результирующей строки в стек.
Добавлено в версии 3.6.
-
BUILD_TUPLE_UNPACK
(count)¶ Выталкивает count итераторов от стека, присоединяет к ним единственный кортеж и вталкивает результат. Реализует итерабельную распаковку в отображениях кортежей
(*x, *y, *z)
.Добавлено в версии 3.5.
-
BUILD_TUPLE_UNPACK_WITH_CALL
(count)¶ Подобен
BUILD_TUPLE_UNPACK
, но используется для синтаксиса вызоваf(*x, *y, *z)
. Элемент стека в позицииcount + 1
должен соответствовать вызываемому объектуf
.Добавлено в версии 3.6.
-
BUILD_LIST_UNPACK
(count)¶ Аналогичен
BUILD_TUPLE_UNPACK
, но вталкивает список вместо кортежа. Реализует распаковку на итерации в отображениях списка[*x, *y, *z]
.Добавлено в версии 3.5.
-
BUILD_SET_UNPACK
(count)¶ Подобен
BUILD_TUPLE_UNPACK
, но вталкивает множество вместо кортежа. Реализует распаковку на итации в отображении множеств{*x, *y, *z}
.Добавлено в версии 3.5.
-
BUILD_MAP_UNPACK
(count)¶ Выталкивает count отображений из стека, сливает их в единственный словарь и выталкивает результат. Реализует распаковку словаря в отображениях словаря
{**x, **y, **z}
.Добавлено в версии 3.5.
-
BUILD_MAP_UNPACK_WITH_CALL
(count)¶ Подобен
BUILD_MAP_UNPACK
, но используется для синтаксиса вызоваf(**x, **y, **z)
. Элемент стека в позицииcount + 2
должен соответствовать вызовуf
.Добавлено в версии 3.5.
Изменено в версии 3.6: Позиция вызываемого объекта определяется добавлением 2 к аргументу опкода вместо его кодировки во втором байте аргумента.
-
LOAD_ATTR
(namei)¶ Заменяет TOS на
getattr(TOS, co_names[namei])
.
-
COMPARE_OP
(opname)¶ Выполняет логическую операцию. Имя операции можно найти в разделе
cmp_op[opname]
.
-
IMPORT_NAME
(namei)¶ Импортирует модуль
co_names[namei]
. TOS и TOS1 выталкиваются и предоставляют fromlist и аргументы level__import__()
. Объект модуля помещается в стек. Текущее пространство имен не затрагивается: для правильной инструкции import последующая инструкцияSTORE_FAST
изменяет пространство имен.
-
IMPORT_FROM
(namei)¶ Загружает атрибут
co_names[namei]
из модуля, находящегося в TOS. Результирующий объект вталкивается в стек для последующего сохранения инструкцииSTORE_FAST
.
-
JUMP_FORWARD
(delta)¶ Увеличивает счетчик байт-кодов на delta.
-
POP_JUMP_IF_TRUE
(target)¶ Если TOS содержит значение true, задает для счетчика байт-кодов значение target. Выталкивает TOS.
Добавлено в версии 3.1.
-
POP_JUMP_IF_FALSE
(target)¶ Если TOS содержит значение false, задает для счетчика байт-кодов значение target. Всплывает TOS.
Добавлено в версии 3.1.
-
JUMP_IF_TRUE_OR_POP
(target)¶ Если TOS содержит значение true, устанавливает счетчик байт-кодов как target и оставляет TOS в стеке. В противном случае (TOS является ложным) выталкивается TOS.
Добавлено в версии 3.1.
-
JUMP_IF_FALSE_OR_POP
(target)¶ Если TOS содержит значение false, устанавливает счетчик байт-кодов в значение target и оставляет TOS в стеке. В противном случае (TOS содержит значение true) выталкивается TOS.
Добавлено в версии 3.1.
-
JUMP_ABSOLUTE
(target)¶ Установить счетчик байт-кодов равным target.
-
FOR_ITER
(delta)¶ TOS - итератор. Вызвать его метод
__next__()
. Если это приводит к появлению нового значения, вталкивает его в стек (оставив итератор под ним). Если итератор указывает, что это исчерпано, TOS выталкивается, и счетчик байт кода увеличивает delta.
-
LOAD_GLOBAL
(namei)¶ Загружает глобальные имена
co_names[namei]
в стек.
-
SETUP_FINALLY
(delta)¶ Вталкивает блок try-finally или try-except клаузулу в стек блока. delta указывает на блок finally или первый except блок.
-
CALL_FINALLY
(delta)¶ Вталкивает адрес следующей инструкции в стек и увеличивает счетчик байт-кодов на delta. Используется для вызова блока finally в качестве «подпрограммы».
Добавлено в версии 3.8.
-
LOAD_FAST
(var_num)¶ Вталкивает ссылку на локальную
co_varnames[var_num]
в стек.
-
STORE_FAST
(var_num)¶ Сохраняет TOS в локальной
co_varnames[var_num]
.
-
DELETE_FAST
(var_num)¶ Удаляет локальную
co_varnames[var_num]
.
-
LOAD_CLOSURE
(i)¶ Вталкивает ссылку в ячейку, содержащуюся в слоте i ячейки и свободное хранилище переменных. Имя переменной равно
co_cellvars[i]
, если i меньше длины co_cellvars. В противном случае этоco_freevars[i - len(co_cellvars)]
.
-
LOAD_DEREF
(i)¶ Загружает ячейку, содержащуюся в слоте i ячейки, и свободное хранилище переменных. Вталкивает ссылку на объект, который ячейка содержит в стеке.
-
LOAD_CLASSDEREF
(i)¶ Очень похожа на
LOAD_DEREF
, но сначала проверяет словарь локальных, прежде чем проконсультироваться с ячейкой. Это используется для загрузки свободных переменных в тела класса.Добавлено в версии 3.4.
-
STORE_DEREF
(i)¶ Сохраняет TOS в ячейке, содержащейся в слоте i ячейке и свободном хранилище переменных.
-
DELETE_DEREF
(i)¶ Опустошает ячейку, содержащуюся в слоте i ячейки и свободное хранилище переменных. Используется инструкция
del
.Добавлено в версии 3.2.
-
RAISE_VARARGS
(argc)¶ Вызывает исключение, используя одну из 3 форм
raise
инструкций в зависимости от значение argc:- 0:
raise
(повторно поднимают предыдущее исключение) - 1:
raise TOS
(поднимает сущность исключения или печатает вTOS
) - 2:
raise TOS1 from TOS
(поднимает сущность исключения или печатает вTOS1
с множеством__cause__
кTOS
)
- 0:
-
CALL_FUNCTION
(argc)¶ Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов. Вершина стека содержит позиционные аргументы с крайним правым аргументом на верху. Ниже аргументов находится вызываемый объект.
CALL_FUNCTION
выталкивает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с теми аргументами и вталкивает возвращаемое значение возвращаемое вызываемым объектом.Изменено в версии 3.6: Опкод используется только для вызова с позиционными аргументами.
-
CALL_FUNCTION_KW
(argc)¶ Вызывает вызываемый объект с позиционными (при наличии) и ключевыми аргументами. argc указывает общее число позиционных и ключевых аргументов. Верхний элемент стека содержит кортеж имен ключевых аргументов. Ниже приведены аргументы ключевой в порядке, соответствующем кортежу. Ниже находятся позиционные аргументы с самым правым параметром сверху. Ниже аргументов находится вызываемый объект.
CALL_FUNCTION_KW
выталкивает все аргументы вызываемого объекта из стека, вызовы вызываемого объекта с теми аргументами и вталкивают возвращаемое значение возвращенное вызываемым объектом.Изменено в версии 3.6: Ключевых аргументы упаковываются в кортеж вместо словаря, argc указывает общее число аргументов.
-
CALL_FUNCTION_EX
(flags)¶ Вызывает вызываемый объект с переменным набором позиционных и ключевых аргументов. Если установлен самый низкий бит flags, вершина стека содержит объект отображения, содержащий дополнительные ключевые аргументы. Ниже указан итерируемый объект, содержащий позиционные аргументы и вызываемый объект для вызова.
BUILD_MAP_UNPACK_WITH_CALL
иBUILD_TUPLE_UNPACK_WITH_CALL
могут быть используемый для слияния нескольких объектов отображения и итерируемых, содержащего аргументы. Перед вызовом вызываемого объекта объект сопоставления и объект итерации распаковываются, а их содержимое передается в виде ключевых и позиционных аргументов соответственно.CALL_FUNCTION_EX
выталкивает все аргументы и вызываемый объект из стека, вызов вызываемого объекта с теми аргументами и вдвигает возвращаемое значение возвращенное вызываемом объектом.Добавлено в версии 3.6.
-
LOAD_METHOD
(namei)¶ Загрузка метода с именем
co_names[namei]
из объекта TOS. Выталкивается TOS. Этот байт- код различает два случая: если у TOS есть метод с правильным именем, байт-код вталкивает несвязанный метод и TOS. TOS будет использоваться как первый аргумент (self
)CALL_METHOD
, вызывая несвязанный метод. ИначеNULL
и объект возвращает вдигаемый найденный атрибут.Добавлено в версии 3.7.
-
CALL_METHOD
(argc)¶ Вызывает метод. argc - количество позиционных аргументов. Ключевые аргументы не поддерживаются. Этот опкод предназначен для использования с
LOAD_METHOD
. Позиционные аргументы находятся в вершине стека. Под ними два элемента, описанные в разделеLOAD_METHOD
стека (либоself
и несвязанный объект метода, либоNULL
и произвольный вызываемый). Все они выталкиваются и возвращаемое значение вталкивается.Добавлено в версии 3.7.
-
MAKE_FUNCTION
(flags)¶ Вталкивает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанный значение флага
0x01
кортеж значения по умолчанию для только позиционных и позиционноключевыми параметров в позиционном порядке0x02
словарь только ключевых параметров значений по умолчанию0x04
аннотация словаря0x08
кортеж, содержащий ячейки для свободных переменных, создавая замыкание- код, связанный с функцией (в TOS1)
- квалифицированное имя функции (в TOS)
-
BUILD_SLICE
(argc)¶ Вталкивает объект слайса в стек. argc должно быть 2 или 3. Если он равен 2,
slice(TOS1, TOS)
вталкивается; если он равен 3, вталкиваетсяslice(TOS2, TOS1, TOS)
. Для получения дополнительной информации см. встроенную функциюslice()
.
-
EXTENDED_ARG
(ext)¶ Префиксы любого опкода у которого слишком большой аргумент, чтобы поместиться в один байт по умолчанию. ext содержит дополнительный байт, который действует как старшие биты в аргументе. Для каждого опкода допускается максимум три префикса
EXTENDED_ARG
, образующих аргумент от двухбайтового до четырёхбайтного.
-
FORMAT_VALUE
(flags)¶ Используется для реализации отформатированного литерала строки (f-строки). Выталкивает дополнительный fmt_spec из стека, затем требуемое value. flags интерпретируется следующим образом:
(flags & 0x03) == 0x00
: value отформатирован как есть.(flags & 0x03) == 0x01
: вызватьstr()
на value перед форматированием.(flags & 0x03) == 0x02
: вызватьrepr()
на value перед форматированием.(flags & 0x03) == 0x03
: вызватьascii()
на value перед форматированием.(flags & 0x04) == 0x04
: вытолкнуть fmt_spec из стека и использовать его, иначе используется пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format()
. Результат помещается в стек.Добавлено в версии 3.6.
-
HAVE_ARGUMENT
¶ На самом деле это не опкод. Он определяет разделительную линию между опкодами, которые не используют своих аргументов и те, которые используют (
< HAVE_ARGUMENT
и>= HAVE_ARGUMENT
соответственно).Изменено в версии 3.6: Теперь у каждой инструкции есть аргумент, но опкоды
< HAVE_ARGUMENT
игнорируют её. Прежде, только у опкодов>= HAVE_ARGUMENT
был аргумент.
Коллекции Opcode¶
Эти коллекции предоставляются для автоматической интроспекции инструкций байт- кода:
-
dis.
opname
¶ Последовательность имен операций с возможностью индексирования с использованием байт-кода.
-
dis.
opmap
¶ Сопоставление имен операций словаря с байт-кодами.
-
dis.
cmp_op
¶ Последовательность всех имен операций сравнения.
-
dis.
hasconst
¶ Последовательность байт-кодов, которые обращаются к константе.
-
dis.
hasfree
¶ Последовательность байт-кодов, которые обращаются к свободной переменной (обратите внимание, что «свободные» в этом контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости или имена во внешних области видимости, на которые ссылаются из этой области видимости. Она не включает ссылки на глобальные или встроенные области видимости).
-
dis.
hasname
¶ Последовательность байт-кодов, обращающихся к атрибуту по имени.
-
dis.
hasjrel
¶ Последовательность байт-кодов предназначенных для относительного перехода к цели.
-
dis.
hasjabs
¶ Последовательность байт-кодов предназначенных для абсолютного перехода к цели.
-
dis.
haslocal
¶ Последовательность байт-кодов, которые обращаются к локальной переменной.
-
dis.
hascompare
¶ Последовательность байт-кодов логических операций.