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
.
Пример: Задана функция myfunc()
:
def myfunc(alist):
return len(alist)
следующая команда может быть использована для отображения разборки myfunc()
:
>>> dis.dis(myfunc)
2 0 RESUME 0
3 2 LOAD_GLOBAL 1 (NULL + len)
14 LOAD_FAST 0 (alist)
16 PRECALL 1
20 CALL 1
30 RETURN_VALUE
(«2» - это номер строки).
Интерфейс командной строки¶
Модуль dis
может быть вызван как скрипт из командной строки:
python -m dis [-h] [-C] [infile]
Принимаются следующие варианты:
- -h, --help¶
Отобразите использование и выход.
- -C, --show-caches¶
Показывать встроенные кэши.
Если указано значение infile
, то его дизассемблированный код будет записан в стандартный вывод. В противном случае дизассемблирование выполняется на основе скомпилированного исходного кода, полученного из стандартного ввода.
Анализ байт-кода¶
Добавлено в версии 3.4.
API анализа байт-кода позволяет заключать фрагменты кода Python в объект Bytecode
, который обеспечивает легкий доступ к деталям скомпилированного кода.
- class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False)¶
Проанализируйте байт-код, соответствующий функции, генератору, асинхронному генератору, сопрограмме, методу, строке исходного кода или объекту кода (как возвращает
compile()
).Это удобная оболочка для многих функций, перечисленных ниже, в первую очередь для
get_instructions()
, поскольку при итерации по экземпляруBytecode
операции с байт-кодом отображаются как экземплярыInstruction
.Если значение first_line не равно
None
, оно указывает номер строки, который должен быть указан для первой исходной строки в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.Если значение current_offset не равно
None
, это указывает на смещение команды в дизассемблированном коде. Установка этого значения означает, чтоdis()
напротив указанного кода операции будет отображаться маркер «текущая команда».Если значение show_caches равно
True
,dis()
, то будут отображаться записи встроенного кэша, используемые интерпретатором для специализации байт-кода.Если значение adaptive равно
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
PRECALL
CALL
RETURN_VALUE
Аналитические функции¶
Модуль dis
также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый результат. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный объект анализа бесполезен:
- dis.code_info(x)¶
Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для предоставленной функции, генератора, асинхронного генератора, сопрограммы, метода, строки исходного кода или объекта кода.
Обратите внимание, что точное содержание кода в строках сильно зависит от реализации и может произвольно изменяться в разных виртуальных машинах Python или версиях Python.
Добавлено в версии 3.2.
Изменено в версии 3.7: Теперь он может обрабатывать объекты сопрограммы и асинхронного генератора.
- dis.show_code(x, *, file=None)¶
Выведите подробную информацию об объекте кода для предоставленной функции, метода, строки исходного кода или объекта кода в файл (или
sys.stdout
, если файл не указан).Это удобное сокращение от
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)¶
Разберите функцию обратной трассировки верхнего уровня, используя последнюю обратную трассировку, если она не была передана. Указывается инструкция, вызывающая исключение.
Дизассемблирование записывается в виде текста в указанный аргумент file, если он указан, и в
sys.stdout
в противном случае.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
- dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)¶
- dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)¶
Разберите объект кода, указав последнюю инструкцию, если была предоставлена команда lasti. Выходные данные разбиты на следующие столбцы:
номер строки для первой инструкции в каждой строке
текущая инструкция, обозначенная как
-->
,обозначенная инструкция, обозначенная символом
>>
,адрес инструкции,
кодовое название операции,
рабочие параметры, и
интерпретация параметров, указанных в круглых скобках.
Интерпретация параметров распознает имена локальных и глобальных переменных, значения констант, целевые значения ветвей и операторы сравнения.
Дизассемблирование записывается в виде текста в указанный аргумент file, если он указан, и в
sys.stdout
в противном случае.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
- dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)¶
Возвращает итератор по инструкциям в предоставленной функции, методе, строке исходного кода или объекте кода.
Итератор генерирует серию
Instruction
именованных кортежей, содержащих подробную информацию о каждой операции в предоставленном коде.Если значение first_line не равно
None
, оно указывает номер строки, который должен быть указан для первой исходной строки в дизассемблированном коде. В противном случае информация об исходной строке (если таковая имеется) берется непосредственно из объекта дизассемблированного кода.Параметры show_caches и adaptive работают так же, как и в
dis()
.Добавлено в версии 3.4.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
- dis.findlinestarts(code)¶
Эта функция-генератор использует метод
co_lines()
из code object кода, чтобы найти смещения, которые являются началами строк в исходном коде. Они генерируются в виде пар(offset, lineno)
.Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.
Изменено в версии 3.10: Метод PEP 626
co_lines()
используется вместоco_firstlineno
иco_lnotab
атрибутов code object.
- dis.findlabels(code)¶
Обнаружьте все смещения в необработанной строке скомпилированного байт-кода code, которые являются целями перехода, и верните список этих смещений.
- dis.stack_effect(opcode, oparg=None, *, jump=None)¶
Вычислите стековый эффект кода операции с аргументом oparg.
Если в коде есть цель перехода и значение jump равно
True
,stack_effect()
, то будет возвращен эффект стека при прыжке. Если значение jump равноFalse
, то будет возвращен эффект стека при отсутствии прыжка. И если jump равенNone
(по умолчанию), он вернет максимальный эффект стека в обоих случаях.Добавлено в версии 3.4.
Изменено в версии 3.8: Добавлен параметр jump.
Инструкции по байт-коду Python¶
Функция get_instructions()
и класс Bytecode
предоставляют подробные сведения об инструкциях байт-кода в виде экземпляров Instruction
:
- class dis.Instruction¶
Подробные сведения об операции с байт-кодом
- opcode¶
цифровой код для операции, соответствующий значениям кода операции, перечисленным ниже, и значениям байт-кода в Коллекции кодов операций.
- opname¶
удобочитаемое название операции
- arg¶
числовой аргумент для операции (если таковой имеется), в противном случае
None
- argval¶
разрешенное значение аргумента (если есть), в противном случае
None
- argrepr¶
понятное человеку описание аргумента операции (если таковой имеется), в противном случае пустая строка.
- offset¶
начальный индекс операции в последовательности байт-кода
- starts_line¶
строка, начинающаяся с этого кода операции (если таковой имеется), в противном случае
None
- is_jump_target¶
True
если другой код переходит сюда, в противном случаеFalse
- positions¶
dis.Positions
объект, содержащий начальное и конечное местоположения, указанные в данной инструкции.
Добавлено в версии 3.4.
Изменено в версии 3.11: Добавлено поле
positions
.
- class dis.Positions¶
В случае, если информация недоступна, в некоторых полях может быть
None
.- lineno¶
- end_lineno¶
- col_offset¶
- end_col_offset¶
Добавлено в версии 3.11.
Компилятор Python в настоящее время генерирует следующие инструкции по байт-коду.
Общие инструкции
- NOP¶
Ничего не делать с кодом. Используется оптимизатором байт-кода в качестве заполнителя и для генерации событий трассировки строк.
- POP_TOP¶
Удаляет элемент верхнего уровня (TOS).
- COPY(i)¶
Переместите i-й элемент на вершину стопки. Элемент не будет удален со своего первоначального места.
Добавлено в версии 3.11.
- SWAP(i)¶
Поменяйте местами TOS с товаром в позиции i.
Добавлено в версии 3.11.
- CACHE¶
Вместо того, чтобы быть настоящей инструкцией, этот код операции используется для выделения дополнительного пространства, позволяющего интерпретатору кэшировать полезные данные непосредственно в самом байт-коде. Он автоматически скрывается всеми утилитами
dis
, но может быть просмотрен с помощьюshow_caches=True
.Логически, это пространство является частью предыдущей инструкции. Многие коды операций предполагают, что за ними последует точное количество кэшей, и будут указывать интерпретатору пропустить их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует соблюдать большую осторожность при чтении или модификации необработанного адаптивного байт-кода, содержащего ускоренные данные.
Добавлено в версии 3.11.
Унарные операции
Унарные операции занимают верхнюю часть стека, применяют операцию и помещают результат обратно в стек.
- 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
является объектом generator iterator или coroutine, то он оставляется как есть. В противном случае реализуетTOS = iter(TOS)
.Добавлено в версии 3.5.
Бинарные операции и операции на месте
Двоичные операции удаляют из стека верхнюю часть стека (TOS) и второй самый верхний элемент стека (TO S1). Они выполняют операцию и помещают результат обратно в стек.
Операции на месте похожи на бинарные операции в том смысле, что они удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, когда TOS1 поддерживает ее, и результирующий TOS может быть (но не обязательно) исходным TOS1.
- BINARY_OP(op)¶
Реализует бинарные операторы и операторы на месте (в зависимости от значения op).
Добавлено в версии 3.11.
- BINARY_SUBSCR¶
Реализует
TOS = TOS1[TOS]
.
- STORE_SUBSCR¶
Реализует
TOS1[TOS] = TOS2
.
- DELETE_SUBSCR¶
Реализует
del TOS1[TOS]
.
Коды операций сопрограммы
- GET_AWAITABLE(where)¶
Реализует
TOS = get_awaitable(TOS)
, гдеget_awaitable(o)
возвращаетo
, еслиo
является объектом сопрограммы или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешаетo.__await__
.Если операнд
where
отличен от нуля, это указывает, где выполняется команда:1
После вызова__aenter__
2
После вызова__aexit__
Добавлено в версии 3.5.
Изменено в версии 3.11: Ранее в этой инструкции не было oparg.
- GET_AITER¶
Реализует
TOS = TOS.__aiter__()
.Добавлено в версии 3.5.
Изменено в версии 3.7: Возврат ожидаемых объектов из
__aiter__
больше не поддерживается.
- GET_ANEXT¶
Помещает
get_awaitable(TOS.__anext__())
в стек. СмотритеGET_AWAITABLE
для получения подробной информации оget_awaitable
.Добавлено в версии 3.5.
- END_ASYNC_FOR¶
Завершает цикл
async for
. Обрабатывает исключение, возникающее при ожидании следующего элемента. Стек содержит асинхронную итерацию в S1 и вызванное исключение в НИХ. Оба они извлекаются. Если исключение неStopAsyncIteration
, оно вызывается повторно.Добавлено в версии 3.8.
Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не из трех элементов.
- BEFORE_ASYNC_WITH¶
Преобразует
__aenter__
и__aexit__
из объекта, находящегося на вершине стека. Помещает__aexit__
и результат__aenter__()
в стек.Добавлено в версии 3.5.
Различные коды операций
- PRINT_EXPR¶
Реализует оператор expression для интерактивного режима. TOS извлекается из стека и печатается. В неинтерактивном режиме оператор expression завершается с помощью
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)
. Используется для реализации понимания dict.Добавлено в версии 3.1.
Изменено в версии 3.8: Значение карты равно TOS, а ключ карты равен S1. Ранее они были изменены на противоположные.
При выполнении всех инструкций SET_ADD
, LIST_APPEND
и MAP_ADD
, в то время как добавленное значение или пара ключ/значение удаляются, объект-контейнер остается в стеке, так что он доступен для дальнейших итераций цикла.
- RETURN_VALUE¶
Возвращает значение TOS вызывающему объекту функции.
- SETUP_ANNOTATIONS¶
Проверяет, определен ли
__annotations__
вlocals()
, если нет, то устанавливается значениеdict
. Этот код операции выдается только в том случае, если тело класса или модуля статически содержит variable annotations.Добавлено в версии 3.6.
- IMPORT_STAR¶
Загружает все символы, не начинающиеся с
'_'
, непосредственно из модуля в локальное пространство имен. Модуль открывается после загрузки всех имен. Этот код операции реализуетfrom module import *
.
- POP_EXCEPT¶
Извлекает значение из стека, которое используется для восстановления состояния исключения.
Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не из трех элементов.
- RERAISE¶
Повторно вызывает исключение, которое в данный момент находится на вершине стека. Если значение oparg не равно нулю, из стека извлекается дополнительное значение, которое используется для установки
f_lasti
текущего кадра.Добавлено в версии 3.9.
Изменено в версии 3.11: Представление исключений в стеке теперь состоит из одного, а не из трех элементов.
- PUSH_EXC_INFO¶
Извлекает значение из стека. Перемещает текущее исключение на вершину стека. Возвращает значение, которое было первоначально извлечено, обратно в стек. Используется в обработчиках исключений.
Добавлено в версии 3.11.
- CHECK_EXC_MATCH¶
Выполняет сопоставление исключений для
except
. Проверяет, является ли TOS 1 исключением, соответствующим TOS. Открывает TOS и выводит логический результат теста.Добавлено в версии 3.11.
- CHECK_EG_MATCH¶
Выполняет сопоставление исключений для
except*
. Применяетsplit(TOS)
к группе исключений, представляющей ЭТИ 1.В случае совпадения извлекает два элемента из стека и помещает неподходящую подгруппу (
None
в случае полного совпадения), за которой следует соответствующая подгруппа. Если совпадений нет, выберите один элемент (тип совпадения) и нажмитеNone
.Добавлено в версии 3.11.
- PREP_RERAISE_STAR¶
Объединяет список созданных и повторно запущенных исключений из TOS в группу исключений для распространения из блока try-except*. Использует исходную группу исключений из TOS1 для восстановления структуры повторно запущенных исключений. Извлекает два элемента из стека и отправляет исключение на повторный вызов или
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(delta)¶
Этот код операции выполняет несколько операций перед запуском блока with. Сначала он загружает
__exit__()
из контекстного менеджера и помещает его в стек для последующего использования с помощьюWITH_EXCEPT_START
. Затем вызывается__enter__()
. Наконец, результат вызова метода__enter__()
помещается в стек.Добавлено в версии 3.11.
- GET_LEN¶
Поместите
len(TOS)
в стопку.Добавлено в версии 3.10.
- MATCH_MAPPING¶
Если TOS является экземпляром
collections.abc.Mapping
(или, более технически, если для него установлен флагPy_TPFLAGS_MAPPING
в егоtp_flags
), поместитеTrue
в стек. В противном случае нажмитеFalse
.Добавлено в версии 3.10.
- MATCH_SEQUENCE¶
Если TOS является экземпляром
collections.abc.Sequence
и не является экземпляромstr
/bytes
/bytearray
( или, более технически: если у него естьPy_TPFLAGS_SEQUENCE
установите флаг в itstp_flags
), поместитеTrue
в стек. В противном случае нажмитеFalse
.Добавлено в версии 3.10.
- MATCH_KEYS¶
TOYS - это набор ключей сопоставления, а TOS1 - это тема для сопоставления. Если TOS1 содержит все ключи в TOS, нажмите
tuple
, содержащие соответствующие значения. В противном случае нажмитеNone
.Добавлено в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также вводила логическое значение, указывающее на успех (
True
) или неудачу (False
).
- STORE_NAME(namei)¶
Реализует
name = TOS
. namei - это индекс name в атрибутеco_names
из code object. Компилятор пытается использоватьSTORE_FAST
илиSTORE_GLOBAL
, если это возможно.
- DELETE_NAME(namei)¶
Реализует
del name
, где namei - это индекс вco_names
атрибуте code object.
- UNPACK_SEQUENCE(count)¶
Распаковывает ИХ в count отдельные значения, которые помещаются в стек справа налево.
- UNPACK_EX(counts)¶
Реализует назначение с выделенной целью: распаковывает итерацию в TOS на отдельные значения, где общее количество значений может быть меньше, чем количество элементов в итерационной таблице: одним из новых значений будет список всех оставшихся элементов.
Младший байт параметра подсчитывает количество значений перед значением списка, старший байт параметра подсчитывает количество значений после него. Результирующие значения помещаются в стек справа налево.
- STORE_ATTR(namei)¶
Реализует
TOS.name = TOS1
, где namei - это индекс имени вco_names
.
- DELETE_ATTR(namei)¶
Реализует
del TOS.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]
, в стек.
- BUILD_TUPLE(count)¶
Создает кортеж, использующий элементы count из стека, и помещает полученный кортеж в стек.
- BUILD_LIST(count)¶
Работает как
BUILD_TUPLE
, но создает список.
- BUILD_SET(count)¶
Работает как
BUILD_TUPLE
, но создает набор.
- BUILD_MAP(count)¶
Помещает новый объект словаря в стек. Помещает элементы
2 * count
таким образом, чтобы в словаре было количество записей:{..., TOS3: TOS2, TOS1: TOS}
.Изменено в версии 3.5: Словарь создается из элементов стека вместо создания пустого словаря, предварительно настроенного для хранения элементов count.
- BUILD_CONST_KEY_MAP(count)¶
Версия
BUILD_MAP
, специализированная для константных ключей. Выводит верхний элемент в стеке, содержащий набор ключей, затем, начиная сTOS1
, подсчитывает значения в пунктах для формирования значений во встроенном словаре.Добавлено в версии 3.6.
- BUILD_STRING(count)¶
Объединяет строки count из стека и помещает полученную строку в стек.
Добавлено в версии 3.6.
- LIST_TO_TUPLE¶
Извлекает список из стека и помещает кортеж, содержащий те же значения.
Добавлено в версии 3.9.
- LIST_EXTEND(i)¶
Вызывает
list.extend(TOS1[-i], TOS)
. Используется для создания списков.Добавлено в версии 3.9.
- SET_UPDATE(i)¶
Вызывает
set.update(TOS1[-i], TOS)
. Используется для построения наборов.Добавлено в версии 3.9.
- DICT_UPDATE(i)¶
Вызывает
dict.update(TOS1[-i], TOS)
. Используется для создания диктовок.Добавлено в версии 3.9.
- DICT_MERGE(i)¶
Как
DICT_UPDATE
, но вызывает исключение для повторяющихся ключей.Добавлено в версии 3.9.
- LOAD_ATTR(namei)¶
Заменяет TOS на
getattr(TOS, co_names[namei])
.
- COMPARE_OP(opname)¶
Выполняет логическую операцию. Название операции можно найти в
cmp_op[opname]
.
- 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]
. Выводятся TOOLS и TOS1, которые предоставляют аргументы fromlist и level для__import__()
. Объект модуля помещается в стек. Текущее пространство имен не затрагивается: для правильной инструкции import последующая инструкцияSTORE_FAST
изменяет пространство имен.
- IMPORT_FROM(namei)¶
Загружает атрибут
co_names[namei]
из модуля, найденного в TOS. Результирующий объект помещается в стек, который впоследствии будет сохранен с помощью инструкцииSTORE_FAST
.
- JUMP_FORWARD(delta)¶
Увеличивает счетчик байт-кода на дельту.
- JUMP_BACKWARD(delta)¶
Уменьшает счетчик байт-кода на дельта. Проверяет наличие прерываний.
Добавлено в версии 3.11.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
Уменьшает счетчик байт-кода на дельта. Не проверяет наличие прерываний.
Добавлено в версии 3.11.
- POP_JUMP_FORWARD_IF_TRUE(delta)¶
Если значение TOS равно true, счетчик байт-кода увеличивается на дельта. Выводится значение TOS.
Добавлено в версии 3.11.
- POP_JUMP_BACKWARD_IF_TRUE(delta)¶
Если значение TOS равно true, счетчик байт-кода уменьшается на дельта. Выдается значение TOS.
Добавлено в версии 3.11.
- POP_JUMP_FORWARD_IF_FALSE(delta)¶
Если значение TOS равно false, счетчик байт-кода увеличивается на дельта. Выводится значение TOS.
Добавлено в версии 3.11.
- POP_JUMP_BACKWARD_IF_FALSE(delta)¶
Если значение TOS равно false, счетчик байт-кода уменьшается на дельта. Выдается TOS.
Добавлено в версии 3.11.
- POP_JUMP_FORWARD_IF_NOT_NONE(delta)¶
Если значение TOS не равно
None
, счетчик байт-кода увеличивается на дельта. Выдается значение TOS.Добавлено в версии 3.11.
- POP_JUMP_BACKWARD_IF_NOT_NONE(delta)¶
Если значение TOS не равно
None
, счетчик байт-кода уменьшается на дельта. Выдается значение TOS.Добавлено в версии 3.11.
- POP_JUMP_FORWARD_IF_NONE(delta)¶
Если значение TOS равно
None
, счетчик байт-кода увеличивается на дельта. Выдается значение TOS.Добавлено в версии 3.11.
- POP_JUMP_BACKWARD_IF_NONE(delta)¶
Если значение TOS равно
None
, счетчик байт-кода уменьшается на дельта. Выдается значение TOS.Добавлено в версии 3.11.
- JUMP_IF_TRUE_OR_POP(delta)¶
Если значение TOS равно true, счетчик байт-кода увеличивается на дельта и игрушки остаются в стеке. В противном случае (значение TOS равно false), TOS удаляется.
Добавлено в версии 3.1.
Изменено в версии 3.11: oparg теперь является относительной дельтой, а не абсолютной целью.
- JUMP_IF_FALSE_OR_POP(delta)¶
Если значение TOS равно false, счетчик байт-кода увеличивается на дельта и игрушки остаются в стеке. В противном случае (значение TOS равно true), TOS удаляется.
Добавлено в версии 3.1.
Изменено в версии 3.11: oparg теперь является относительной дельтой, а не абсолютной целью.
- FOR_ITER(delta)¶
TOS - это iterator. Вызовите его метод
__next__()
. Если это приведет к получению нового значения, поместите его в стек (оставив итератор под ним). Если итератор указывает, что он исчерпан, он выдается, и счетчик байт-кода увеличивается на дельта.
- LOAD_GLOBAL(namei)¶
Загружает глобальный файл с именем
co_names[namei>>1]
в стек.Изменено в версии 3.11: Если установлен младший бит
namei
, тоNULL
помещается в стек перед глобальной переменной.
- LOAD_FAST(var_num)¶
Помещает ссылку на локальный
co_varnames[var_num]
в стек.
- STORE_FAST(var_num)¶
Сохраняет права доступа в локальном
co_varnames[var_num]
.
- DELETE_FAST(var_num)¶
Удаляет локальный
co_varnames[var_num]
.
- MAKE_CELL(i)¶
Создает новую ячейку в слоте
i
. Если этот слот не пуст, то это значение сохраняется в новой ячейке.Добавлено в версии 3.11.
- LOAD_CLOSURE(i)¶
Возвращает ссылку на ячейку, содержащуюся в слоте
i
хранилища «fast locals». Имя переменнойco_fastlocalnames[i]
.Обратите внимание, что
LOAD_CLOSURE
фактически является псевдонимом дляLOAD_FAST
. Он существует для того, чтобы сделать байт-код более читабельным.Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- LOAD_DEREF(i)¶
Загружает ячейку, содержащуюся в ячейке
i
хранилища «fast locals». Помещает ссылку на объект, который содержится в ячейке, в стек.Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- LOAD_CLASSDEREF(i)¶
Очень похоже на
LOAD_DEREF
, но сначала проверяет словарь locals, прежде чем обращаться к ячейке. Это используется для загрузки свободных переменных в тела классов.Добавлено в версии 3.4.
Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- STORE_DEREF(i)¶
Сохраняет данные в ячейке, содержащейся в слоте
i
хранилища «fast locals».Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- DELETE_DEREF(i)¶
Освобождает ячейку, содержащуюся в слоте
i
, из хранилища «fast locals». Используется операторомdel
.Добавлено в версии 3.2.
Изменено в версии 3.11:
i
больше не смещается на длинуco_varnames
.
- COPY_FREE_VARS(n)¶
Копирует свободные переменные
n
из замыкания во фрейм. Устраняет необходимость в специальном коде на стороне вызывающего объекта при вызове замыканий.Добавлено в версии 3.11.
- RAISE_VARARGS(argc)¶
Вызывает исключение, используя одну из 3 форм инструкции
raise
, в зависимости от значения argc:0:
raise
( повторно вызвать предыдущее исключение)1:
raise TOS
( создайте экземпляр исключения или введите значениеTOS
)2:
raise TOS1 from TOS
( создайте экземпляр исключения или введите значениеTOS1
, установив для__cause__
значениеTOS
)
- CALL(argc)¶
Вызывает вызываемый объект с количеством аргументов, указанным в
argc
, включая именованные аргументы, указанные в предыдущемKW_NAMES
, если таковые имеются. В стеке находятся (в порядке возрастания) либо:нулевой
Вызываемый
Позиционные аргументы
Именованные аргументы
или:
Вызываемый
self
Остальные позиционные аргументы
Именованные аргументы
argc
- это сумма позиционных и именованных аргументов, за исключениемself
, когдаNULL
отсутствует.CALL
извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и возвращает возвращаемое значение, возвращаемое вызываемым объектом.Добавлено в версии 3.11.
- CALL_FUNCTION_EX(flags)¶
Вызывает вызываемый объект с переменным набором позиционных аргументов и аргументов ключевого слова. Если задан младший бит flags, в верхней части стека находится объект отображения, содержащий дополнительные аргументы ключевого слова. Перед вызовом вызываемого объекта объект сопоставления и итерируемый объект «распаковываются», а их содержимое передается в виде ключевых слов и позиционных аргументов соответственно.
CALL_FUNCTION_EX
извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и возвращает возвращаемое значение возвращаемый вызываемым объектом.Добавлено в версии 3.6.
- LOAD_METHOD(namei)¶
Загружает метод с именем
co_names[namei]
из объекта TOS. Выводится TOS. Этот байт-код различает два случая: если в TOS есть метод с правильным именем, байт-код запускает несвязанный метод и TOS. TOS будет использоваться в качестве первого аргумента (self
)CALL
при вызове метода unbound. В противном случае,NULL
и объект, возвращаемый при поиске по атрибуту, будут удалены.Добавлено в версии 3.7.
- PRECALL(argc)¶
Префиксы
CALL
. Логически это не является операцией. Она существует для обеспечения эффективной специализации вызовов.argc
- это количество аргументов, как описано вCALL
.Добавлено в версии 3.11.
- PUSH_NULL¶
Помещает
NULL
в стек. Используется в последовательности вызовов, чтобы соответствоватьNULL
, передаваемомуLOAD_METHOD
для вызовов, не связанных с методами.Добавлено в версии 3.11.
- KW_NAMES(i)¶
Префиксы
PRECALL
. Сохраняет ссылку наco_consts[consti]
во внутреннюю переменную для использования с помощьюCALL
.co_consts[consti]
это должен быть кортеж из строк.Добавлено в версии 3.11.
- MAKE_FUNCTION(flags)¶
Помещает новый функциональный объект в стек. Снизу вверх используемый стек должен состоять из значений, если аргумент содержит указанное значение флага
0x01
набор значений по умолчанию только для позиционных параметров и позиционных параметров или ключевых слов в позиционном порядке0x02
словарь значений параметров по умолчанию только для ключевых слов0x04
набор строк, содержащих аннотации к параметрам0x08
кортеж, содержащий ячейки для свободных переменных, замыкающийкод, связанный с функцией (в TOS)
Изменено в версии 3.10: Значение флага
0x04
представляет собой набор строк вместо словаряИзменено в версии 3.11: Полное имя в TOS было удалено.
- BUILD_SLICE(argc)¶
Помещает объект slice в стек. 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 из стека, затем требуемое значение. flags интерпретируется следующим образом:
(flags & 0x03) == 0x00
: значение отформатировано как есть.(flags & 0x03) == 0x01
: вызовитеstr()
для значения перед его форматированием.(flags & 0x03) == 0x02
: вызовитеrepr()
для значения перед его форматированием.(flags & 0x03) == 0x03
: вызовитеascii()
для значения перед его форматированием.(flags & 0x04) == 0x04
: извлеките fmt_spec из стека и используйте его, в противном случае используйте пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format()
. Результат помещается в стек.Добавлено в версии 3.6.
- MATCH_CLASS(count)¶
ЭТО набор имен атрибутов ключевых слов, TOS1 - класс, с которым выполняется сопоставление, а TOS2 - объект сопоставления. count - количество позиционных вложенных шаблонов.
Введите TOS, TOS1 и TOS2. Если TOS2 является экземпляром TEST1 и имеет атрибуты позиции и ключевого слова, требуемые для count и TOS, введите набор извлеченных атрибутов. В противном случае введите
None
.Добавлено в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также вводила логическое значение, указывающее на успех (
True
) или неудачу (False
).
- RESUME(where)¶
Нерабочий. Выполняет внутреннюю трассировку, отладку и оптимизацию.
Операнд
where
указывает, где встречаетсяRESUME
:0
Начало выполнения функции1
После выраженияyield
2
После выраженияyield from
3
После выраженияawait
Добавлено в версии 3.11.
- RETURN_GENERATOR¶
Создайте генератор, сопрограмму или асинхронный генератор из текущего кадра. Очистите текущий кадр и верните только что созданный генератор.
Добавлено в версии 3.11.
- SEND¶
Отправляет
None
в подгенератор этого генератора. Используется в операторахyield from
иawait
.Добавлено в версии 3.11.
- ASYNC_GEN_WRAP¶
Преобразует значение в верхней части стека в
async_generator_wrapped_value
. Используется для вывода в асинхронных генераторах.Добавлено в версии 3.11.
- HAVE_ARGUMENT¶
На самом деле это не код операции. Он определяет разделительную линию между кодами операций, которые не используют свой аргумент, и теми, которые используют его (
< HAVE_ARGUMENT
и>= HAVE_ARGUMENT
соответственно).Изменено в версии 3.6: Теперь у каждой команды есть аргумент, но коды операций
< HAVE_ARGUMENT
игнорируют его. Раньше аргумент был только у кодов операций>= HAVE_ARGUMENT
.
Коллекции кодов операций¶
Эти коллекции предназначены для автоматического анализа инструкций байт-кода:
- dis.opname¶
Последовательность имен операций, индексируемая с помощью байт-кода.
- dis.opmap¶
Словарь преобразует имена операций в байт-код.
- dis.cmp_op¶
Последовательность названий всех операций сравнения.
- dis.hasconst¶
Последовательность байт-кодов, которые обращаются к константе.
- dis.hasfree¶
Последовательность байт-кодов, которые обращаются к свободной переменной (обратите внимание, что «свободный» в данном контексте относится к именам в текущей области, на которые ссылаются внутренние области, или именам во внешних областях, на которые ссылаются из этой области. Он * не* включает ссылки на глобальные или встроенные области видимости).
- dis.hasname¶
Последовательность байт-кодов, которые обращаются к атрибуту по имени.
- dis.hasjrel¶
Последовательность байт-кодов, имеющих относительную цель перехода.
- dis.hasjabs¶
Последовательность байт-кодов, имеющих абсолютную цель перехода.
- dis.haslocal¶
Последовательность байт-кодов, которые обращаются к локальной переменной.
- dis.hascompare¶
Последовательность байт-кодов логических операций.