dis — Диссеблер для байткода Python
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байткода CPython байткода путём его дизассемблирования. Байткод CPython, который этот модуль принимает на вход, определён в файле Include/opcode.h и используется компилятором и интерпретатором.
Деталь реализации CPython: Байткод — деталь реализации интерпретатора CPython. Нет гарантий, что байткод не будет добавлен, удалён или изменён между версиями Python. Использование этого модуля не гарантирует совместимость с разными виртуальными машинами Python или версиями 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» — номер строки).
Анализ байткода
Новое в версии 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_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
-
argrepr -
Удобочитаемое описание аргумента операции
-
offset -
Начальный индекс операции в последовательности байткода
-
starts_line -
Строка, начинающаяся с этого opcode (если есть), в противном случае
None
-
is_jump_target -
Trueесли другой код переходит сюда, в противном случаеFalse
Новая в версии 3.4.
-
Компилятор Python в настоящее время генерирует следующие инструкции байткода.
Общие инструкции
-
NOP -
Инструкция без действия. Используется в качестве заполнителя оптимизатором байткода.
-
POP_TOP -
Удаляет элемент сверху стека.
-
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.
-
BEFORE_ASYNC_WITH -
Разрешает
__aenter__и__aexit__из объекта в верхней части стека. Помещает__aexit__и результат__aenter__()в стек.Новое в версии 3.5.
-
SETUP_ASYNC_WITH -
Создаёт новый объект фрейма.
Новое в версии 3.5.
Разные инструкции
-
PRINT_EXPR -
Реализует оператор выражения для интерактивного режима. Элемент вершины стека удаляется и выводится на печать. В неинтерактивном режиме оператор выражения завершается с помощью
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: Значение словаря является элементом вершины стека, а ключ словаря — элементом следующего за ним элемента стека. Раньше порядок был обратным.
Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD при добавлении значения или пары ключ/значение, добавляемое значение или пара извлекаются из стека, а объект контейнера остаётся в стеке для дальнейших итераций цикла.
-
RETURN_VALUE -
Возвращает значение из вершины стека вызывающему функции.
-
YIELD_VALUE -
Извлекает элемент вершины стека и передаёт его как результат из генератора.
-
YIELD_FROM -
Извлекает элемент вершины стека и делегирует его как под-итератор из генератора.
Новое в версии 3.3.
-
SETUP_ANNOTATIONS -
Проверяет, определено ли
__annotations__вlocals(), если нет, устанавливает его в пустойdict. Эта инструкция генерируется только в том случае, если тело класса или модуля содержит статические аннотации переменных.Новое в версии 3.6.
-
IMPORT_STAR -
Загружает все символы, не начинающиеся с
'_', напрямую из модуля TOS в локальное пространство имён. После загрузки всех имён модуль удаляется из стека. Эта инструкция реализуетfrom module import *.
-
POP_BLOCK -
Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, обозначающий операторы
tryи подобные.
-
POP_EXCEPT -
Удаляет один блок из стека блоков. Удаляемый блок должен быть блоком обработчика исключений, как неявно создаётся при входе в обработчик исключений. Помимо удаления лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.
-
POP_FINALLY(preserve_tos) -
Очищает стек значений и стек блоков. Если preserve_tos не
0, элемент вершины стека сначала извлекается и помещается в стек после выполнения других операций со стеком:- Если 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) -
Эта инструкция выполняет несколько операций перед началом блока with. Сначала она загружает
__exit__()из менеджера контекста и помещает его в стек для последующего использованияWITH_CLEANUP_START. Затем вызывается__enter__(), и блок finally, указывающий на 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. SECOND —Noneили тип исключения (помещённый в стек при возникновении исключения).Удаляет два значения из стека. Если SECOND не None и TOS истинно, разворачивает блок 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, извлекает 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__(). Объект модуля помещается на стек. Текущее пространство имён не затрагивается: для правильного оператора импорта последующая инструкция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_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.
-
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имели аргумент.
Сборники операторов
Эти коллекции предназначены для автоматического получения сведений об операторах байткода:
-
dis.opname -
Последовательность имён операций, индексируемая с помощью байткода.
-
dis.opmap -
Словарь, сопоставляющий имена операций с байткодами.
-
dis.cmp_op -
Последовательность всех имён операций сравнения.
-
dis.hasconst -
Последовательность байткодов, которые обращаются к константе.
-
dis.hasfree -
Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «свободные» в данном контексте относятся к именам в текущей области видимости, которые ссылаются на внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области видимости. Это не включает ссылки на глобальные или встроенные области видимости).
-
dis.hasname -
Последовательность байткодов, которые обращаются к атрибуту по имени.
-
dis.hasjrel -
Последовательность байткодов, у которых есть относительная метка перехода.
-
dis.hasjabs -
Последовательность байткодов, у которых есть абсолютная метка перехода.
-
dis.haslocal -
Последовательность байткодов, которые обращаются к локальной переменной.
-
dis.hascompare -
Последовательность байткодов булевых операций.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/dis.html