dis — Диссеблер для байткода Python
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байткода CPython, дизассемблируя его. Байткод CPython, который принимает на вход этот модуль, определен в файле Include/opcode.h и используется компилятором и интерпретатором.
Подробность реализации CPython: Байткод — это деталь реализации интерпретатора CPython. Не гарантируется, что байткод не будет добавлен, удален или изменён между версиями Python. Использование этого модуля не должно считаться совместимым с другими виртуальными машинами Python или версиями Python.
Изменено в версии 3.6: Используется 2 байта для каждой инструкции. Раньше количество байтов варьировалось в зависимости от инструкции.
Изменено в версии 3.10: Аргумент инструкций перехода, обработки исключений и циклов теперь является смещением инструкции, а не смещением байта.
Пример: Дана функция 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» — номер строки).
Анализ байткода
Новое в версии 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()отобразит маркер «текущей инструкции» для указанного кода операции.-
classmethod from_traceback(tb) -
Создайте экземпляр
Bytecodeиз заданного стека отладки, установив current_offset на инструкцию, ответственную за исключение.
-
codeobj -
Объект скомпилированного кода.
-
first_line -
Первая строка исходного кода объекта (если доступна).
-
dis() -
Возвращает отформатированный вид операций байткода (так же, как выводится с помощью
dis.dis(), но возвращается в виде многострочной строки).
-
info() -
Возвращает отформатированную многострочную строку с подробной информацией об объекте кода, подобно
code_info().
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
Пример:
>>> 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_linesобъекта кода code для поиска смещений, которые являются началом строк в исходном коде. Они генерируются как пары(offset, lineno).Изменено в версии 3.6: Номера строк могут быть уменьшающимися. Ранее они всегда увеличивались.
Изменено в версии 3.10: Используется метод PEP 626
co_linesвместо атрибутовco_firstlinenoиco_lnotabобъекта кода.
-
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
-
argrepr -
Человекопонятное описание аргумента операции
-
offset -
Начальный индекс операции в последовательности байткода
-
starts_line -
Строка, начатая этим opcode (если есть), в противном случае
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 -
Помещает
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. Этот оператор генерируется только в том случае, если тело класса или модуля содержит аннотации переменных статически.Добавлена в версии 3.6.
-
IMPORT_STAR -
Загружает все символы, не начинающиеся с
'_'напрямую из модуля TOS в локальное пространство имён. Модуль извлекается после загрузки всех имён. Этот оператор реализуетfrom module import *.
-
POP_BLOCK -
Удаляет один блок из стека блоков. В рамках каждого кадра существует стек блоков, обозначающий операторы
tryи аналогичные.
-
POP_EXCEPT -
Удаляет один блок из стека блоков. Удаляемый блок должен быть блоком обработки исключений, как неявно создаваемый при входе в обработчик исключений. В дополнение к извлечению лишних значений из стека кадра, последние три извлечённых значения используются для восстановления состояния исключения.
-
RERAISE -
Повторно поднимает исключение, которое в данный момент находится вверху стека. Если oparg не равен нулю, восстанавливает
f_lastiтекущего кадра до значения, при котором было поднято исключение.Добавлена в версии 3.9.
-
WITH_EXCEPT_START -
Вызывает функцию в позиции 7 на стеке с тремя верхними элементами стека в качестве аргументов. Используется для реализации вызова
context_manager.__exit__(*exc_info())при возникновении исключения в оператореwith.Добавлена в версии 3.9.
-
LOAD_ASSERTION_ERROR -
Помещает
AssertionErrorна стек. Используется операторомassert.Добавлена в версии 3.9.
-
LOAD_BUILD_CLASS -
Помещает
builtins.__build_class__()на стек. Позже он вызывается операторомCALL_FUNCTIONдля создания класса.
-
SETUP_WITH(delta) -
Этот оператор выполняет несколько операций перед началом блока with. Во-первых, он загружает
__exit__()из менеджера контекста и помещает его на стек для последующего использования операторомWITH_EXCEPT_START. Затем, вызывается__enter__(), и блок finally, указывающий на delta, помещается на стек. Наконец, результат вызова метода__enter__()помещается на стек. Следующий оператор либо проигнорирует его (POP_TOP), либо сохранит его в (одной или нескольких) переменных (STORE_FAST,STORE_NAMEилиUNPACK_SEQUENCE).Добавлена в версии 3.2.
-
COPY_DICT_WITHOUT_KEYS -
TOS — кортеж ключей отображения, а TOS1 — объект-субъект соответствия. Заменить TOS на словарь, созданный из элементов TOS1, но без ключей из TOS.
Добавлена в версии 3.10.
-
GET_LEN -
Поместить
len(TOS)на стек.Добавлена в версии 3.10.
-
MATCH_MAPPING -
Если TOS является экземпляром
collections.abc.Mapping(или, точнее: если в егоtp_flagsустановлен флагPy_TPFLAGS_MAPPING), поместитьTrueна стек. В противном случае поместитьFalse.Добавлена в версии 3.10.
-
MATCH_SEQUENCE -
Если TOS является экземпляром
collections.abc.Sequenceи не является экземпляромstr/bytes/bytearray(или, точнее: если в егоtp_flagsустановлен флагPy_TPFLAGS_SEQUENCE), поместитьTrueна стек. В противном случае поместитьFalse.Добавлена в версии 3.10.
-
MATCH_KEYS -
TOS — кортеж ключей отображения, а TOS1 — объект-субъект соответствия. Если TOS1 содержит все ключи в TOS, поместить на стек кортеж, содержащий соответствующие значения, после
True. В противном случае поместитьNone, послеFalse.Добавлена в версии 3.10.
Все следующие операторы используют свои аргументы.
-
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, извлекает count значений для формирования значений в созданном словаре.Новое в версии 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 -
Подобно
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]. TOS и TOS1 извлекаются и предоставляют аргументы fromlist и level функции__import__(). Объект модуля помещается на стек. Текущее пространство имён не затрагивается: для правильной инструкции импорта последующая инструкцияSTORE_FASTизменяет пространство имён.
-
IMPORT_FROM(namei) -
Загружает атрибут
co_names[namei]из модуля, находящегося в TOS. Результирующий объект помещается на стек для последующего хранения инструкциейSTORE_FAST.
-
JUMP_FORWARD(delta) -
Увеличивает счётчик байткода на delta.
-
POP_JUMP_IF_TRUE(target) -
Если TOS истинно, устанавливает счётчик байткода на target. TOS извлекается.
Новое в версии 3.1.
-
POP_JUMP_IF_FALSE(target) -
Если TOS ложно, устанавливает счётчик байткода на target. TOS извлекается.
Новое в версии 3.1.
-
JUMP_IF_NOT_EXC_MATCH(target) -
Проверяет, является ли второе значение на стеке исключением, соответствующим TOS, и переходит, если это не так. Два значения извлекаются со стека.
Новое в версии 3.9.
-
JUMP_IF_TRUE_OR_POP(target) -
Если TOS истинно, устанавливает счётчик байткода на target и оставляет TOS на стеке. В противном случае (TOS ложно), TOS извлекается.
Новое в версии 3.1.
-
JUMP_IF_FALSE_OR_POP(target) -
Если TOS ложно, устанавливает счётчик байткода на target и оставляет TOS на стеке. В противном случае (TOS истинно), TOS извлекается.
Новое в версии 3.1.
-
JUMP_ABSOLUTE(target) -
Устанавливает счётчик байткода на target.
-
FOR_ITER(delta) -
TOS — итератор. Вызывается его метод
__next__(). Если это возвращает новое значение, помещает его на стек (оставляя итератор ниже). Если итератор указывает, что он исчерпан, TOS извлекается, и счётчик байткода увеличивается на delta.
-
LOAD_GLOBAL(namei) -
Загружает глобальную переменную с именем
co_names[namei]на стек.
-
SETUP_FINALLY(delta) -
Помещает блок try из инструкции try-finally или try-except на стек блоков. delta указывает на блок finally или первый блок except.
-
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 установлен, вершина стека содержит объект отображения, содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта объект отображения и итерируемый объект «распаковываются», и их содержимое передается как именованные и позиционные аргументы соответственно.
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)
Изменено в версии 3.10: Значение флага
0x04— кортеж строк вместо словаря -
-
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) == 0x01: вызываетсяrepr()над value перед его форматированием. -
(flags & 0x03) == 0x03: вызываетсяascii()над value перед его форматированием. -
(flags & 0x04) == 0x04: извлекает fmt_spec со стека и использует его, в противном случае использует пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format(). Результат выталкивается на стек.Добавлено в версии 3.6.
-
-
MATCH_CLASS(count) -
TOS — кортеж имен атрибутов, TOS1 — класс, с которым производится сопоставление, а TOS2 — предмет сопоставления. count — количество позиционных подшаблонов.
Извлекается TOS. Если TOS2 является экземпляром TOS1 и имеет позиционные и именованные атрибуты, необходимые count и TOS, то TOS устанавливается в
True, а TOS1 — в кортеж извлеченных атрибутов. В противном случае TOS устанавливается вFalse.Добавлено в версии 3.10.
-
GEN_START(kind) -
Извлекается TOS. Операнд
kindсоответствует типу генератора или корутины. Допустимые типы — 0 для генератора, 1 для корутины и 2 для асинхронного генератора.Добавлено в версии 3.10.
-
ROT_N(count) -
Поднимает верхние count элементов стека на одну позицию вверх и переносит TOS вниз на позицию count.
Добавлено в версии 3.10.
-
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 -
Последовательность байткодов логических операций.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/dis.html