dis — Диссектор байткода Python
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байткода CPython байткода путём его дизассемблирования. Байткод CPython, который принимает этот модуль в качестве входных данных, определён в файле Include/opcode.h и используется компилятором и интерпретатором.
Примечание реализации CPython: Байткод — это деталь реализации интерпретатора CPython. Нет гарантий, что байткод не будет добавлен, удалён или изменён между версиями Python. Использование этого модуля не гарантирует работоспособность на разных виртуальных машинах Python или разных релизах Python.
Пример: Дана функция myfunc():
def myfunc(alist):
return len(alist)
следующая команда может быть использована для отображения дизассемблирования myfunc():
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
3 LOAD_FAST 0 (alist)
6 CALL_FUNCTION 1
9 RETURN_VALUE
(«2» — это номер строки).
1. Анализ байткода
Введено в версии 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().
-
Пример:
>>> bytecode = dis.Bytecode(myfunc) >>> for instr in bytecode: ... print(instr.opname) ... LOAD_GLOBAL LOAD_FAST CALL_FUNCTION RETURN_VALUE
2. Функции анализа
Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные напрямую в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный объект анализа не нужен:
-
dis.code_info(x) -
Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для предоставленной функции, генератора, метода, строки исходного кода или объекта кода.
Обратите внимание, что точное содержимое строк информации о коде сильно зависит от реализации, и они могут произвольно меняться между виртуальными машинами Python или версиями Python.
Введено в версии 3.2.
-
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) -
Разобрать объект x. x может обозначать модуль, класс, метод, функцию, генератор, объект кода, строку исходного кода или последовательность байтов исходного байткода. Для модуля он дизассемблирует все функции. Для класса он дизассемблирует все методы (включая методы класса и статические методы). Для объекта кода или последовательности байтового кода он печатает по одной строке для каждой инструкции байткода. Строки сначала компилируются в объекты кода с помощью встроенной функции
compile()перед дизассемблированием. Если объект не указан, эта функция дизассемблирует последний стек отслеживания.Дизассемблирование записывается как текст в предоставленный аргумент file, если он указан, и в
sys.stdoutв противном случае.Изменено в версии 3.4: Добавлен параметр file.
-
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).
-
dis.findlabels(code) -
Обнаруживает все смещения в объекте кода code, которые являются целевыми адресами переходов, и возвращает список этих смещений.
-
dis.stack_effect(opcode[, oparg]) -
Вычисляет эффект стека для opcode с аргументом oparg.
Введено в версии 3.4.
3. Инструкции байткода 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 -
Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний элемент вниз на третью позицию.
-
DUP_TOP -
Дублирует ссылку на вершине стека.
-
DUP_TOP_TWO -
Дублирует две ссылки на вершине стека, сохраняя их в том же порядке.
Унарные операции
Унарные операции берут верхний элемент стека, применяют операцию и возвращают результат обратно на стек.
-
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].
Корутинные opcode
-
GET_AWAITABLE -
Реализует
TOS = get_awaitable(TOS), гдеget_awaitable(o)возвращаетoеслиoявляется объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или раскрываетo.__await__.
-
GET_AITER -
Реализует
TOS = get_awaitable(TOS.__aiter__()). Подробности оGET_AWAITABLEиget_awaitableсм. вGET_AWAITABLE.
-
GET_ANEXT -
Реализует
PUSH(get_awaitable(TOS.__anext__())). Подробности оGET_AWAITABLEиget_awaitableсм. вGET_AWAITABLE.
-
BEFORE_ASYNC_WITH -
Раскрывает
__aenter__и__aexit__из объекта на вершине стека. Помещает__aexit__и результат__aenter__()на стек.
-
SETUP_ASYNC_WITH -
Создаёт новый объект фрейма.
Разные opcode
-
PRINT_EXPR -
Реализует оператор выражения для интерактивного режима. Элемент TOS удаляется из стека и выводится на печать. В неинтерактивном режиме оператор выражения завершается инструкцией
POP_TOP.
-
BREAK_LOOP -
Завершает цикл из-за оператора
break.
-
CONTINUE_LOOP(target) -
Продолжает цикл из-за оператора
continue. target — адрес для перехода (который должен быть инструкциейFOR_ITER).
-
SET_ADD(i) -
Вызывает
set.add(TOS1[-i], TOS). Используется для реализации множественных пониманий.
-
LIST_APPEND(i) -
Вызывает
list.append(TOS[-i], TOS). Используется для реализации списковых включений.
-
MAP_ADD(i) -
Вызывает
dict.setitem(TOS1[-i], TOS, TOS1). Используется для реализации словариковых включений.
Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, в то время как добавленное значение или пара ключ/значение извлекается, объект контейнера остается в стеке, чтобы он был доступен для дальнейших итераций цикла.
-
RETURN_VALUE -
Возвращает TOS вызывающей функции.
-
YIELD_VALUE -
Извлекает TOS и передает его из генератора.
-
YIELD_FROM -
Извлекает TOS и делегирует ему как подповторителю из генератора.
Новое в версии 3.3.
-
IMPORT_STAR -
Загружает все символы, не начинающиеся с
'_'непосредственно из модуля TOS в локальное пространство имен. Модуль извлекается после загрузки всех имен. Эта инструкция реализуетfrom module import *.
-
POP_BLOCK -
Удаляет один блок из стека блоков. В каждом кадре есть стек блоков, обозначающий вложенные циклы, операторы try и т.п.
-
POP_EXCEPT -
Удаляет один блок из стека блоков. Попавший блок должен быть блоком обработки исключений, как неявно созданный при входе в обработчик исключений. В дополнение к извлечению лишних значений из стека фрейма, последние три извлеченные значения используются для восстановления состояния исключения.
-
END_FINALLY -
Завершает операнд
finally. Интерпретатор вспоминает, нужно ли повторно поднимать исключение или возвращать функцию, и продолжает с внешним блоком.
-
LOAD_BUILD_CLASS -
Помещает
builtins.__build_class__()в стек. Позже он вызываетсяCALL_FUNCTIONдля создания класса.
-
SETUP_WITH(delta) -
Эта инструкция выполняет несколько операций перед началом блока with. Сначала она загружает
__exit__()из менеджера контекста и помещает его в стек для последующего использованияWITH_CLEANUP. Затем вызывается__enter__(), и в стек помещается блок finally, указывающий на delta. Наконец, результат вызова метода enter помещается в стек. Следующая инструкция либо проигнорирует его (POP_TOP), либо сохранит его в (переменной/переменных) (STORE_FAST,STORE_NAMEилиUNPACK_SEQUENCE).
-
WITH_CLEANUP_START -
Очищает стек при выходе из блока оператора
with. TOS — это связанный метод__exit__()менеджера контекста. Ниже TOS находятся 1–3 значения, указывающие, как/почему был вызван блок finally:- SECOND =
None - (SECOND, THIRD) = (
WHY_{RETURN,CONTINUE}), retval - SECOND =
WHY_*; нет retval ниже него - (SECOND, THIRD, FOURTH) = exc_info()
В последнем случае вызывается
TOS(SECOND, THIRD, FOURTH), в противном случаеTOS(None, None, None). В стек помещаются SECOND и результат вызова. - SECOND =
-
WITH_CLEANUP_FINISH -
Извлекает тип исключения и результат вызова функции «exit» из стека.
Если стек представляет исключение и вызов функции возвращает значение «true», эта информация «удаляется» и заменяется одним
WHY_SILENCED, чтобы предотвратить повторное поднятие исключенияEND_FINALLY. (Но нелокальные переходы все равно будут возобновлены.)
Все следующие инструкции ожидают аргументов. Аргумент состоит из двух байтов, где старший байт последним.
-
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_TUPLE_UNPACK(count) -
Извлекает count итерируемых объектов из стека, объединяет их в один кортеж и помещает результат в стек. Реализует распаковку итерируемых объектов в кортежи
(*x, *y, *z).Новое в версии 3.5.
-
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(oparg) -
Это аналогично
BUILD_MAP_UNPACK, но используется дляf(**x, **y, **z)синтаксиса вызова. Самый младший байт oparg — это количество отображений, относительное положение соответствующей вызываемой функцииfзакодировано во втором байте oparg.Введено в версии 3.5.
-
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 извлекается.
-
POP_JUMP_IF_FALSE(target) -
Если TOS ложно, устанавливает счётчик байткода на target. TOS извлекается.
-
JUMP_IF_TRUE_OR_POP(target) -
Если TOS истинно, устанавливает счётчик байткода на target и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.
-
JUMP_IF_FALSE_OR_POP(target) -
Если TOS ложно, устанавливает счётчик байткода на target и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.
-
JUMP_ABSOLUTE(target) -
Устанавливает счётчик байткода на target.
-
FOR_ITER(delta) -
TOS — это итератор. Вызывается его метод
__next__(). Если это возвращает новое значение, помещает его на стек (оставляя итератор ниже него). Если итератор указывает, что он исчерпан, TOS извлекается, и счётчик байткода увеличивается на delta.
-
LOAD_GLOBAL(namei) -
Загружает глобальную переменную, имя которой
co_names[namei]на стек.
-
SETUP_LOOP(delta) -
Помещает блок цикла на стек блоков. Блок охватывает текущую инструкцию с размером в delta байт.
-
SETUP_EXCEPT(delta) -
Помещает блок try из блока try-except на стек блоков. delta указывает на первый блок except.
-
SETUP_FINALLY(delta) -
Помещает блок try из блока try-except на стек блоков. delta указывает на блок finally.
-
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, но сначала проверяет словарь локальных переменных перед обращением к ячейке. Это используется для загрузки свободных переменных в телах классов.
-
STORE_DEREF(i) -
Сохраняет TOS в ячейку, содержащуюся в слоте i хранения ячеек и свободных переменных.
-
DELETE_DEREF(i) -
Очищает ячейку, содержащуюся в слоте i хранения ячеек и свободных переменных. Используется оператором
del.
-
RAISE_VARARGS(argc) -
Вызывает исключение. argc указывает на количество аргументов оператора raise, от 0 до 3. Обработчик найдёт трассировку стека как TOS2, параметр как TOS1, а исключение как TOS.
-
CALL_FUNCTION(argc) -
Вызывает вызываемый объект. Низкий байт argc указывает на количество позиционных аргументов, высокий байт — на количество ключевых аргументов. Стек содержит ключевые аргументы сверху (если есть), затем позиционные аргументы ниже (если есть), затем вызываемый объект ниже. Каждый ключевой аргумент представлен двумя значениями в стеке: именем аргумента и его значением, причём значение аргумента выше имени в стеке. Позиционные аргументы помещаются в порядке их передачи в вызываемый объект, причём самый правый позиционный аргумент находится сверху.
CALL_FUNCTIONизвлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращённое значение вызываемого объекта на стек.
-
MAKE_FUNCTION(argc) -
Помещает новый объект функции на стек. От нижнего к верхнему, потребляемый стек должен состоять из
-
argc & 0xFFобъектов аргументов по умолчанию в позиционном порядке для позиционных параметров -
(argc >> 8) & 0xFFпар имени и аргумента по умолчанию, причём имя находится непосредственно ниже объекта в стеке, для параметров только с ключевыми аргументами -
(argc >> 16) & 0x7FFFобъектов аннотаций параметров - кортежа, перечисляющего имена параметров для аннотаций (только если есть объекты аннотаций)
- кода, связанного с функцией (в TOS1)
- полного имени функции (в TOS)
-
-
MAKE_CLOSURE(argc) -
Создаёт новый объект функции, устанавливает свой слот __closure__ и помещает его на стек. TOS — это полное имя функции, TOS1 — код, связанный с функцией, а TOS2 — кортеж, содержащий ячейки для свободных переменных замыкания. argc интерпретируется как в
MAKE_FUNCTION; аннотации и значения по умолчанию также находятся в том же порядке ниже TOS2.
-
BUILD_SLICE(argc) -
Помещает объект среза на стек. argc должен быть 2 или 3. Если это 2,
slice(TOS1, TOS)помещается на стек; если это 3,slice(TOS2, TOS1, TOS)помещается на стек. См. встроенную функциюslice()для получения дополнительной информации.
-
EXTENDED_ARG(ext) -
Предваряет любую инструкцию, имеющую аргумент, слишком большой для размещения в двух байтах по умолчанию. ext содержит два дополнительных байта, которые вместе с аргументом последующей инструкции образуют четырёхбайтовый аргумент, ext являясь двумя старшими байтами.
-
CALL_FUNCTION_VAR(argc) -
Вызывает вызываемый объект, аналогично
CALL_FUNCTION. argc представляет количество ключевых и позиционных аргументов, идентичноCALL_FUNCTION. Верх стека содержит ключевые аргументы (если есть), хранящиеся аналогичноCALL_FUNCTION. Ниже него — итерируемый объект, содержащий дополнительные позиционные аргументы. Ниже него — позиционные аргументы (если есть) и вызываемый объект, аналогичноCALL_FUNCTION. Перед вызовом вызываемого объекта итерируемый объект «распаковывается», а его содержимое добавляется к позиционным аргументам, переданным внутри. Итерируемый объект игнорируется при вычислении значенияargc.Изменено в версии 3.5: В версиях с 3.0 по 3.4 итерируемый объект был выше ключевых аргументов; в 3.5 итерируемый объект был перемещён ниже ключевых аргументов.
-
CALL_FUNCTION_KW(argc) -
Вызывает вызываемый объект, аналогично
CALL_FUNCTION. argc представляет количество ключевых и позиционных аргументов, идентичноCALL_FUNCTION. Верх стека содержит объект отображения, содержащий дополнительные ключевые аргументы. Ниже него находятся ключевые аргументы (если есть), позиционные аргументы (если есть) и вызываемый объект, идентичноCALL_FUNCTION. Перед вызовом вызываемого объекта, объект отображения вверху стека «распаковывается», и его содержимое добавляется к ключевым аргументам, переданным в. Объект отображения вверху стека игнорируется при вычислении значенияargc.
-
CALL_FUNCTION_VAR_KW(argc) -
Вызывает вызываемый объект, аналогично
CALL_FUNCTION_VARиCALL_FUNCTION_KW. argc представляет количество ключевых и позиционных аргументов, идентичноCALL_FUNCTION. Верх стека содержит объект отображения, как и вCALL_FUNCTION_KW. Под ним находятся ключевые аргументы (если есть), хранящиеся идентичноCALL_FUNCTION. Под ними находится итерируемый объект, содержащий дополнительные позиционные аргументы. Под ним находятся позиционные аргументы (если есть) и вызываемый объект, идентичноCALL_FUNCTION. Перед вызовом вызываемого объекта, объект отображения и итерируемый объект «распаковываются», и их содержимое передается в качестве ключевых и позиционных аргументов соответственно, идентичноCALL_FUNCTION_VARиCALL_FUNCTION_KW. Объект отображения и итерируемый объект игнорируются при вычислении значенияargc.Изменено в версии 3.5: В версиях 3.0 до 3.4 итерируемый объект находился над ключевыми аргументами; в 3.5 итерируемый объект был перемещен под ключевыми аргументами.
-
HAVE_ARGUMENT -
Это не совсем оператор. Он определяет разделительную линию между операторами, которые не принимают аргументы
< HAVE_ARGUMENTи теми, которые принимают>= HAVE_ARGUMENT.
4. Коллекции операторов
Эти коллекции предоставляются для автоматического интроспекции инструкций байт-кода:
-
dis.opname -
Последовательность имён операций, индексируемая с помощью байт-кода.
-
dis.opmap -
Словарь, сопоставляющий имена операций с байт-кодами.
-
dis.cmp_op -
Последовательность всех имён операций сравнения.
-
dis.hasconst -
Последовательность байт-кодов, которые обращаются к константе.
-
dis.hasfree -
Последовательность байт-кодов, которые обращаются к свободной переменной (обратите внимание, что «свободные» в данном контексте относятся к именам в текущей области видимости, к которым обращаются внутренние области видимости, или к именам во внешних областях видимости, к которым обращаются из этой области видимости. Это не включает ссылки на глобальные или встроенные области видимости).
-
dis.hasname -
Последовательность байт-кодов, которые обращаются к атрибуту по имени.
-
dis.hasjrel -
Последовательность байт-кодов, имеющих относительную цель перехода.
-
dis.hasjabs -
Последовательность байт-кодов, имеющих абсолютную цель перехода.
-
dis.haslocal -
Последовательность байт-кодов, которые обращаются к локальной переменной.
-
dis.hascompare -
Последовательность байт-кодов логических операций.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/dis.html