dis — дизассемблер байткода Python
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байткода CPython посредством его дизассемблирования. Байткод CPython, который этот модуль принимает на вход, определён в файле Include/opcode.h и используется компилятором и интерпретатором.
Особенность реализации CPython: Байткод — это деталь реализации интерпретатора CPython. Нет никаких гарантий, что байткод не будет добавлен, удалён или изменён между версиями Python. Не следует считать, что этот модуль будет работать в разных виртуальных машинах Python или выпусках Python.
Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байтов зависело от инструкции.
Изменено в версии 3.10: Аргумент инструкций перехода, обработки исключений и циклов теперь указывает смещение инструкции, а не смещение байта.
Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими встроенными записями кэша, которые представлены инструкциями CACHE. По умолчанию эти инструкции скрыты, но их можно показать, передав show_caches=True любой служебной функции dis. Кроме того, теперь интерпретатор адаптирует байткод, специализируя его для различных условий выполнения. Адаптивный байткод можно показать, передав adaptive=True.
Изменено в версии 3.12: Аргумент инструкции перехода — это смещение целевой инструкции относительно инструкции, расположенной сразу после записей CACHE инструкции перехода.
Следовательно, наличие инструкций CACHE не имеет значения для прямых переходов, но его нужно учитывать при анализе обратных переходов.
Пример: дана функция myfunc():
def myfunc(alist):
return len(alist)
следующую команду можно использовать для отображения дизассемблированного кода myfunc():
>>> dis.dis(myfunc)
2 0 RESUME 0
3 2 LOAD_GLOBAL 1 (NULL + len)
12 LOAD_FAST 0 (alist)
14 CALL 1
22 RETURN_VALUE
(«2» — это номер строки).
Интерфейс командной строки
Модуль dis можно вызвать из командной строки как скрипт:
python -m dis [-h] [infile]
Доступны следующие параметры:
-
-h, --help -
Показать справку и завершить работу.
Если указан infile, его дизассемблированный код будет записан в stdout. В противном случае дизассемблирование выполняется над скомпилированным исходным кодом, полученным из stdin.
Анализ байткода
Добавлено в версии 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 CALL 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, 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, чтобы найти смещения, соответствующие началам строк в исходном коде. Они генерируются в виде пар(offset, lineno).Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.
Изменено в версии 3.10: Вместо атрибутов
co_firstlinenoиco_lnotabобъекта кода используется методco_lines()из PEP 626.
-
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 -
числовой код операции, соответствующий значениям кодов операций, перечисленным ниже, и значениям байт-кода в наборах кодов операций.
-
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 генерирует следующие инструкции байт-кода.
Общие инструкции
Далее мы будем обозначать стек интерпретатора как STACK и описывать операции с ним так, как если бы он был списком Python. Верхушка стека соответствует STACK[-1] в этом языке.
-
NOP -
Пустая инструкция. Используется оптимизатором байт-кода как заполнитель, а также для генерации событий трассировки строк.
-
POP_TOP -
Удаляет элемент с вершины стека:
STACK.pop()
-
END_FOR -
Удаляет два верхних значения из стека. Эквивалентно
POP_TOP;POP_TOP. Используется для очистки в конце циклов, отсюда и название.Добавлено в версии 3.12.
-
END_SEND -
Реализует
del STACK[-2]. Используется для очистки при завершении генератора.Добавлено в версии 3.12.
-
COPY(i) -
Помещает i-й элемент на вершину стека, не удаляя его с исходного места:
assert i > 0 STACK.append(STACK[-i])
Добавлено в версии 3.11.
-
SWAP(i) -
Меняет местами верхний элемент стека и i-й элемент:
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
Добавлено в версии 3.11.
-
CACHE -
Этот код операции не является настоящей инструкцией, а используется для выделения дополнительного пространства, в котором интерпретатор может кэшировать полезные данные непосредственно в байт-коде. Все утилиты
disавтоматически скрывают его, но его можно просмотреть с помощьюshow_caches=True.Логически это пространство является частью предшествующей инструкции. Многие коды операций требуют точного числа следующих за ними кэшей и указывают интерпретатору пропускать их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому при чтении или изменении необработанного адаптивного байт-кода с ускоренными данными следует проявлять особую осторожность.
Добавлено в версии 3.11.
Унарные операции
Унарные операции берут верхний элемент стека, выполняют над ним операцию и помещают результат обратно в стек.
-
UNARY_NEGATIVE -
Реализует
STACK[-1] = -STACK[-1].
-
UNARY_NOT -
Реализует
STACK[-1] = not STACK[-1].
-
UNARY_INVERT -
Реализует
STACK[-1] = ~STACK[-1].
-
GET_ITER -
Реализует
STACK[-1] = iter(STACK[-1]).
-
GET_YIELD_FROM_ITER -
Если
STACK[-1]является объектом итератора-генератора или корутины, он остаётся без изменений. В противном случае реализуетSTACK[-1] = iter(STACK[-1]).Добавлено в версии 3.5.
Бинарные операции и операции на месте
Бинарные операции удаляют два верхних элемента стека (STACK[-1] и STACK[-2]). Они выполняют операцию, а затем помещают результат обратно в стек.
Операции на месте подобны бинарным, но выполняются на месте, если STACK[-2] поддерживает это, и результирующее значение STACK[-1] может быть (но не обязано быть) исходным STACK[-2].
-
BINARY_OP(op) -
Реализует бинарные операторы и операторы на месте (в зависимости от значения op):
rhs = STACK.pop() lhs = STACK.pop() STACK.append(lhs op rhs)
Добавлено в версии 3.11.
-
BINARY_SUBSCR -
Реализует:
key = STACK.pop() container = STACK.pop() STACK.append(container[key])
-
STORE_SUBSCR -
Реализует:
key = STACK.pop() container = STACK.pop() value = STACK.pop() container[key] = value
-
DELETE_SUBSCR -
Реализует:
key = STACK.pop() container = STACK.pop() del container[key]
-
BINARY_SLICE -
Реализует:
end = STACK.pop() start = STACK.pop() container = STACK.pop() STACK.append(container[start:end])
Добавлено в версии 3.12.
-
STORE_SLICE -
Реализует:
end = STACK.pop() start = STACK.pop() container = STACK.pop() values = STACK.pop() container[start:end] = value
Добавлено в версии 3.12.
Коды операций корутин
-
GET_AWAITABLE(where) -
Реализует
STACK[-1] = get_awaitable(STACK[-1]), гдеget_awaitable(o)возвращаетo, еслиoявляется объектом корутины или объектом генератора с флагомCO_ITERABLE_COROUTINE, либо разрешаетo.__await__.Если операнд
whereненулевой, он указывает, где встречается инструкция:-
1: после вызова__aenter__ -
2: после вызова__aexit__
Добавлено в версии 3.5.
Изменено в версии 3.11: Ранее у этой инструкции не было аргумента oparg.
-
-
GET_AITER -
Реализует
STACK[-1] = STACK[-1].__aiter__().Добавлено в версии 3.5.
Изменено в версии 3.7: Возвращать объекты, поддерживающие ожидание, из
__aiter__больше не поддерживается.
-
GET_ANEXT -
Помещает
STACK.append(get_awaitable(STACK[-1].__anext__()))в стек. Подробные сведения оget_awaitableсм. вGET_AWAITABLE.Добавлено в версии 3.5.
-
END_ASYNC_FOR -
Завершает цикл
async for. Обрабатывает исключение, возникшее при ожидании следующего элемента. В стеке находятся асинхронный итерируемый объект вSTACK[-2]и возникшее исключение вSTACK[-1]. Оба удаляются. Если исключение не являетсяStopAsyncIteration, оно возбуждается повторно.Добавлено в версии 3.8.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.
-
CLEANUP_THROW -
Обрабатывает исключение, возникшее при вызове
throw()илиclose()через текущий кадр. ЕслиSTACK[-1]является экземпляромStopIteration, удаляет три значения из стека и помещает в него атрибутvalue. В противном случае повторно возбуждаетSTACK[-1].Добавлено в версии 3.12.
-
BEFORE_ASYNC_WITH -
Разрешает
__aenter__и__aexit__изSTACK[-1]. Помещает__aexit__и результат__aenter__()в стек:STACK.extend((__aexit__, __aenter__())
Добавлено в версии 3.5.
Различные коды операций
-
SET_ADD(i) -
Реализует:
item = STACK.pop() set.add(STACK[-i], item)
Используется для реализации включений множеств.
-
LIST_APPEND(i) -
Реализует:
item = STACK.pop() list.append(STACK[-i], item)
Используется для реализации включений списков.
-
MAP_ADD(i) -
Реализует:
value = STACK.pop() key = STACK.pop() dict.__setitem__(STACK[-i], key, value)
Используется для реализации включений словарей.
Добавлено в версии 3.1.
Изменено в версии 3.8: Значение отображения находится в
STACK[-1], а ключ отображения — вSTACK[-2]. Ранее они располагались наоборот.
Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD добавляемое значение или пара ключ/значение удаляется со стека, но объект-контейнер остаётся в стеке, чтобы быть доступным при следующих итерациях цикла.
-
RETURN_VALUE -
Возвращает
STACK[-1]вызывающему функцию коду.
-
RETURN_CONST(consti) -
Возвращает
co_consts[consti]вызывающему функцию коду.Добавлено в версии 3.12.
-
YIELD_VALUE -
Выдаёт
STACK.pop()из генератора.Изменено в версии 3.11: Значение oparg стало соответствовать глубине стека.
Изменено в версии 3.12: Значение oparg стало соответствовать глубине блока исключений для эффективного закрытия генераторов.
-
SETUP_ANNOTATIONS -
Проверяет, определено ли
__annotations__вlocals(); если нет, задаёт для него пустое значениеdict. Этот код операции генерируется только в том случае, если тело класса или модуля статически содержит аннотации переменных.Добавлено в версии 3.6.
-
POP_EXCEPT -
Удаляет значение из стека, которое используется для восстановления состояния исключения.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.
-
RERAISE -
Повторно возбуждает исключение, находящееся на вершине стека. Если oparg ненулевой, удаляет из стека дополнительное значение, используемое для установки
f_lastiтекущего кадра.Добавлено в версии 3.9.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.
-
PUSH_EXC_INFO -
Удаляет значение из стека. Помещает текущее исключение на вершину стека. Возвращает в стек исходно удалённое значение. Используется в обработчиках исключений.
Добавлено в версии 3.11.
-
CHECK_EXC_MATCH -
Выполняет сопоставление исключений для
except. Проверяет, является лиSTACK[-2]исключением, соответствующимSTACK[-1]. УдаляетSTACK[-1]и помещает в стек булев результат проверки.Добавлено в версии 3.11.
-
CHECK_EG_MATCH -
Выполняет сопоставление исключений для
except*. Применяетsplit(STACK[-1])к группе исключений, представляющейSTACK[-2].При совпадении удаляет два элемента из стека и помещает в него несовпавшую подгруппу (
Noneв случае полного совпадения), а затем совпавшую подгруппу. При отсутствии совпадения удаляет один элемент (тип совпадения) и помещает в стек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 -
Этот код операции выполняет несколько действий перед началом блока with. Сначала он загружает
__exit__()из менеджера контекста и помещает его в стек для последующего использования кодом операцииWITH_EXCEPT_START. Затем вызывается__enter__(). Наконец, результат вызова метода__enter__()помещается в стек.Добавлено в версии 3.11.
-
GET_LEN -
Выполняет
STACK.append(len(STACK[-1])). Используется в инструкцияхmatch, где требуется сравнить структуру с шаблоном.Добавлено в версии 3.10.
-
MATCH_MAPPING -
Если
STACK[-1]является экземпляромcollections.abc.Mapping(или, точнее, если в егоtp_flagsустановлен флагPy_TPFLAGS_MAPPING), помещаетTrueв стек. В противном случае помещаетFalse.Добавлено в версии 3.10.
-
MATCH_SEQUENCE -
Если
STACK[-1]является экземпляромcollections.abc.Sequenceи не является экземпляромstr/bytes/bytearray(или, точнее, если в егоtp_flagsустановлен флагPy_TPFLAGS_SEQUENCE), помещаетTrueв стек. В противном случае помещаетFalse.Добавлено в версии 3.10.
-
MATCH_KEYS -
STACK[-1]— это кортеж ключей отображения, аSTACK[-2]— объект, сопоставляемый с шаблоном. ЕслиSTACK[-2]содержит все ключи изSTACK[-1], помещает кортежtupleс соответствующими значениями в стек. В противном случае помещаетNone.Добавлено в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также помещала булево значение, указывающее на успех (
True) или неудачу (False).
-
STORE_NAME(namei) -
Реализует
name = STACK.pop(). namei — индекс name в атрибутеco_namesобъекта объект кода. Если возможно, компилятор пытается использоватьSTORE_FASTилиSTORE_GLOBAL.
-
DELETE_NAME(namei) -
Реализует
del name, где namei — индекс в атрибутеco_namesобъекта объект кода.
-
UNPACK_SEQUENCE(count) -
Распаковывает
STACK[-1]в отдельные значения в количестве count, которые помещаются в стек справа налево. Требует наличия ровно count значений:assert(len(STACK[-1]) == count) STACK.extend(STACK.pop()[:-count-1:-1])
-
UNPACK_EX(counts) -
Реализует присваивание со звёздочной целью: распаковывает итерируемый объект в
STACK[-1]на отдельные значения, при этом общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.Количество значений до и после значения-списка ограничено 255.
Количество значений перед значением-списком кодируется в аргументе кода операции. Количество значений после списка, если они есть, кодируется с помощью
EXTENDED_ARG. Таким образом, аргумент можно рассматривать как значение из двух байтов: младший байт counts задаёт число значений перед значением-списком, а старший байт counts — число значений после него.Извлечённые значения помещаются в стек справа налево, то есть после выполнения
a, *b, c = dбудет сохранено какSTACK.extend((a, b, c)).
-
STORE_ATTR(namei) -
Реализует:
obj = STACK.pop() value = STACK.pop() obj.name = value
где namei — индекс имени в
co_namesобъекта объект кода.
-
DELETE_ATTR(namei) -
Реализует:
obj = STACK.pop() del obj.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]. Имя ищется сначала в локальной области видимости, затем в глобальной и потом во встроенных именах.
-
LOAD_LOCALS -
Помещает ссылку на словарь локальных переменных в стек. Это используется для подготовки словарей пространств имён для
LOAD_FROM_DICT_OR_DEREFиLOAD_FROM_DICT_OR_GLOBALS.Добавлено в версии 3.12.
-
LOAD_FROM_DICT_OR_GLOBALS(i) -
Снимает отображение со стека и ищет в нём значение для
co_names[namei]. Если имя там не найдено, ищет его в глобальной области видимости, а затем во встроенных именах, аналогичноLOAD_GLOBAL. Используется для загрузки глобальных переменных в областях видимости аннотаций внутри тел классов.Добавлено в версии 3.12.
-
BUILD_TUPLE(count) -
Создаёт кортеж, снимая со стека count элементов, и помещает полученный кортеж в стек:
if count == 0: value = () else: value = tuple(STACK[-count:]) STACK = STACK[:-count] STACK.append(value)
-
BUILD_LIST(count) -
Работает как
BUILD_TUPLE, но создаёт список.
-
BUILD_SET(count) -
Работает как
BUILD_TUPLE, но создаёт множество.
-
BUILD_MAP(count) -
Помещает в стек новый объект словаря. Снимает
2 * countэлементов, чтобы словарь содержал count записей:{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.Изменено в версии 3.5: Словарь создаётся из элементов стека, а не как пустой словарь, предварительно выделенный для хранения count элементов.
-
BUILD_CONST_KEY_MAP(count) -
Версия
BUILD_MAP, специализированная для константных ключей. Снимает верхний элемент стека, содержащий кортеж ключей, а затем, начиная сSTACK[-2], снимает count значений, чтобы сформировать значения в создаваемом словаре.Добавлено в версии 3.6.
-
BUILD_STRING(count) -
Объединяет count строк со стека и помещает полученную строку в стек.
Добавлено в версии 3.6.
-
LIST_EXTEND(i) -
Реализует:
seq = STACK.pop() list.extend(STACK[-i], seq)
Используется для создания списков.
Добавлено в версии 3.9.
-
SET_UPDATE(i) -
Реализует:
seq = STACK.pop() set.update(STACK[-i], seq)
Используется для создания множеств.
Добавлено в версии 3.9.
-
DICT_UPDATE(i) -
Реализует:
map = STACK.pop() dict.update(STACK[-i], map)
Используется для создания словарей.
Добавлено в версии 3.9.
-
DICT_MERGE(i) -
Как
DICT_UPDATE, но вызывает исключение при наличии повторяющихся ключей.Добавлено в версии 3.9.
-
LOAD_ATTR(namei) -
Если младший бит
nameiне установлен, заменяетSTACK[-1]наgetattr(STACK[-1], co_names[namei>>1]).Если младший бит
nameiустановлен, будет предпринята попытка загрузить метод с именемco_names[namei>>1]из объектаSTACK[-1]. ЗначениеSTACK[-1]снимается со стека. Эта инструкция байт-кода различает два случая: если уSTACK[-1]есть метод с нужным именем, инструкция помещает в стек несвязанный метод иSTACK[-1]. При вызове несвязанного метода инструкцияCALLиспользуетSTACK[-1]в качестве первого аргумента (self). В противном случае в стек помещаютсяNULLи объект, возвращённый при поиске атрибута.Изменено в версии 3.12: Если младший бит
nameiустановлен, перед атрибутом или несвязанным методом в стек помещаетсяNULLилиselfсоответственно.
-
LOAD_SUPER_ATTR(namei) -
Эта инструкция реализует
super()как в форме без аргументов, так и в форме с двумя аргументами (например,super().method(),super().attrиsuper(cls, self).method(),super(cls, self).attr).Она снимает со стека три значения (сверху вниз): -
self: первый аргумент текущего метода -cls: класс, в котором был определён текущий метод - глобальное имяsuperВ отношении своего аргумента она работает аналогично
LOAD_ATTR, за исключением того, чтоnameiсдвигается влево на 2 бита, а не на 1.Младший бит
nameiуказывает на необходимость попытки загрузить метод, как и вLOAD_ATTR; в результате в стек помещаютсяNULLи загруженный метод. Если этот бит не установлен, в стек помещается одно значение.Если установлен второй младший бит
namei, это означает, что вызовsuper()был выполнен с двумя аргументами (если бит не установлен — без аргументов).Добавлено в версии 3.12.
-
COMPARE_OP(opname) -
Выполняет логическую операцию. Имя операции можно найти в
cmp_op[opname >> 4].Изменено в версии 3.12: Индекс cmp_op теперь хранится в четырёх старших битах oparg, а не в четырёх младших.
-
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]. ЗначенияSTACK[-1]иSTACK[-2]снимаются со стека и передаются как аргументы fromlist и level функции__import__(). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: при обычной инструкции импорта последующая инструкцияSTORE_FASTизменяет пространство имён.
-
IMPORT_FROM(namei) -
Загружает атрибут
co_names[namei]из модуля, найденного вSTACK[-1]. Полученный объект помещается в стек, чтобы впоследствии быть сохранённым инструкциейSTORE_FAST.
-
JUMP_FORWARD(delta) -
Увеличивает счётчик байт-кода на delta.
-
JUMP_BACKWARD(delta) -
Уменьшает счётчик байт-кода на delta. Проверяет наличие прерываний.
Добавлено в версии 3.11.
-
JUMP_BACKWARD_NO_INTERRUPT(delta) -
Уменьшает счётчик байт-кода на delta. Не проверяет наличие прерываний.
Добавлено в версии 3.11.
-
POP_JUMP_IF_TRUE(delta) -
Если
STACK[-1]истинно, увеличивает счётчик байт-кода на delta.STACK[-1]снимается со стека.Изменено в версии 3.11: Теперь oparg задаёт относительное смещение, а не абсолютную цель перехода. Эта инструкция является псевдоинструкцией; в конечном байт-коде она заменяется направленными вариантами (вперёд/назад).
Изменено в версии 3.12: Больше не является псевдоинструкцией.
-
POP_JUMP_IF_FALSE(delta) -
Если
STACK[-1]ложно, увеличивает счётчик байт-кода на delta.STACK[-1]снимается со стека.Изменено в версии 3.11: Теперь oparg задаёт относительное смещение, а не абсолютную цель перехода. Эта инструкция является псевдоинструкцией; в конечном байт-коде она заменяется направленными вариантами (вперёд/назад).
Изменено в версии 3.12: Больше не является псевдоинструкцией.
-
POP_JUMP_IF_NOT_NONE(delta) -
Если
STACK[-1]не равноNone, увеличивает счётчик байт-кода на delta.STACK[-1]снимается со стека.Эта инструкция является псевдоинструкцией; в конечном байт-коде она заменяется направленными вариантами (вперёд/назад).
Добавлено в версии 3.11.
Изменено в версии 3.12: Больше не является псевдоинструкцией.
-
POP_JUMP_IF_NONE(delta) -
Если
STACK[-1]равноNone, увеличивает счётчик байт-кода на delta.STACK[-1]снимается со стека.Эта инструкция является псевдоинструкцией; в конечном байт-коде она заменяется направленными вариантами (вперёд/назад).
Добавлено в версии 3.11.
Изменено в версии 3.12: Больше не является псевдоинструкцией.
-
FOR_ITER(delta) -
STACK[-1]— это итератор. Вызывает его метод__next__(). Если тот возвращает новое значение, помещает его в стек, оставляя итератор под ним. Если итератор сообщает, что исчерпан, счётчик байт-кода увеличивается на delta.Изменено в версии 3.12: До версии 3.11 итератор снимался со стека при исчерпании.
-
LOAD_GLOBAL(namei) -
Загружает в стек глобальное имя
co_names[namei>>1].Изменено в версии 3.11: Если младший бит
nameiустановлен, перед глобальной переменной в стек помещаетсяNULL.
-
LOAD_FAST(var_num) -
Помещает в стек ссылку на локальную переменную
co_varnames[var_num].Изменено в версии 3.12: Теперь эта инструкция используется только в тех случаях, когда локальная переменная гарантированно инициализирована. Она не может вызвать
UnboundLocalError.
-
LOAD_FAST_CHECK(var_num) -
Помещает в стек ссылку на локальную переменную
co_varnames[var_num]и вызываетUnboundLocalError, если локальная переменная не была инициализирована.Добавлено в версии 3.12.
-
LOAD_FAST_AND_CLEAR(var_num) -
Помещает в стек ссылку на локальную переменную
co_varnames[var_num](или помещает в стекNULL, если локальная переменная не была инициализирована) и присваиваетNULLзначениеco_varnames[var_num].Добавлено в версии 3.12.
-
STORE_FAST(var_num) -
Сохраняет
STACK.pop()в локальную переменнуюco_varnames[var_num].
-
DELETE_FAST(var_num) -
Удаляет локальную переменную
co_varnames[var_num].
-
MAKE_CELL(i) -
Создаёт новую ячейку в слоте
i. Если слот не пуст, его значение сохраняется в новой ячейке.Добавлено в версии 3.11.
-
LOAD_CLOSURE(i) -
Помещает в стек ссылку на ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных». Имя переменной —co_fastlocalnames[i].Обратите внимание, что
LOAD_CLOSUREфактически является псевдонимом дляLOAD_FAST. Эта инструкция существует, чтобы сделать байт-код немного более читаемым.Изменено в версии 3.11:
iбольше не смещается на длинуco_varnames.
-
LOAD_DEREF(i) -
Загружает ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных». Помещает в стек ссылку на объект, содержащийся в ячейке.Изменено в версии 3.11:
iбольше не смещается на длинуco_varnames.
-
LOAD_FROM_DICT_OR_DEREF(i) -
Снимает отображение со стека и ищет в нём имя, связанное со слотом
iхранилища «быстрых локальных переменных». Если имя там не найдено, загружает его из ячейки в слотеi, аналогичноLOAD_DEREF. Используется для загрузки свободных переменных в телах классов (где ранее использоваласьLOAD_CLASSDEREF), а также в областях видимости аннотаций внутри тел классов.Добавлено в версии 3.12.
-
STORE_DEREF(i) -
Сохраняет
STACK.pop()в ячейку, содержащуюся в слотеiхранилища «быстрых локальных переменных».Изменено в версии 3.11:
iбольше не смещается на длинуco_varnames.
-
DELETE_DEREF(i) -
Очищает ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных». Используется инструкциейdel.Добавлено в версии 3.2.
Изменено в версии 3.11:
iбольше не смещается на длинуco_varnames.
-
COPY_FREE_VARS(n) -
Копирует
nсвободных переменных из замыкания во фрейм. Устраняет необходимость в специальном коде на стороне вызывающего при вызове замыканий.Добавлено в версии 3.11.
-
RAISE_VARARGS(argc) -
Вызывает исключение, используя одну из трёх форм инструкции
raiseв зависимости от значения argc:- 0:
raise(повторно вызывает предыдущее исключение) - 1:
raise STACK[-1](вызывает экземпляр или тип исключения вSTACK[-1]) - 2:
raise STACK[-2] from STACK[-1](вызывает экземпляр или тип исключения вSTACK[-2], установив__cause__в значениеSTACK[-1])
- 0:
-
CALL(argc) -
Вызывает вызываемый объект с числом аргументов, указанным в
argc, включая именованные аргументы, указанные предыдущей инструкциейKW_NAMES, если таковые имеются. На стеке (в порядке возрастания) находится одно из следующих:- NULL
- Вызываемый объект
- Позиционные аргументы
- Именованные аргументы
или:
- Вызываемый объект
self- Оставшиеся позиционные аргументы
- Именованные аргументы
argc— это общее число позиционных и именованных аргументов, за исключениемself, еслиNULLотсутствует.CALLснимает со стека все аргументы и вызываемый объект, вызывает его с этими аргументами и помещает в стек возвращённое вызываемым объектом значение.Добавлено в версии 3.11.
-
CALL_FUNCTION_EX(flags) -
Вызывает вызываемый объект с переменным набором позиционных и именованных аргументов. Если младший бит flags установлен, верхний элемент стека — это объект-отображение, содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта содержимое объекта-отображения и итерируемого объекта распаковывается и передаётся соответственно как именованные и позиционные аргументы.
CALL_FUNCTION_EXснимает со стека все аргументы и вызываемый объект, вызывает его с этими аргументами и помещает в стек возвращённое вызываемым объектом значение.Добавлено в версии 3.6.
-
PUSH_NULL -
Помещает
NULLв стек. Используется в последовательности вызова для соответствияNULL, помещаемому инструкциейLOAD_METHODпри вызовах, не являющихся вызовами методов.Добавлено в версии 3.11.
-
KW_NAMES(consti) -
Предшествует инструкции
CALL. Сохраняет ссылку наco_consts[consti]во внутренней переменной для использования инструкциейCALL.co_consts[consti]должен быть кортежем строк.Добавлено в версии 3.11.
-
MAKE_FUNCTION(flags) -
Помещает в стек новый объект функции. Снизу вверх стек, с которого снимаются значения, должен состоять из следующих значений, если аргумент содержит соответствующий флаг:
-
0x01кортеж значений по умолчанию для позиционных параметров и параметров, передаваемых по имени или позиции, в порядке их следования -
0x02словарь значений по умолчанию для параметров, доступных только по имени -
0x04кортеж строк, содержащих аннотации параметров -
0x08кортеж с ячейками свободных переменных, образующими замыкание - код, связанный с функцией (в
STACK[-1])
Изменено в версии 3.10: Значение флага
0x04теперь представляет собой кортеж строк, а не словарь.Изменено в версии 3.11: Полное имя в
STACK[-1]удалено. -
-
BUILD_SLICE(argc) -
Помещает объект среза в стек. Значение argc должно быть равно 2 или 3. Если оно равно 2, реализует:
end = STACK.pop() start = STACK.pop() STACK.append(slice(start, end))
если оно равно 3, реализует:
step = STACK.pop() end = STACK.pop() start = STACK.pop() STACK.append(slice(start, end, step))
Дополнительные сведения см. во встроенной функции
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.
-
-
MATCH_CLASS(count) -
STACK[-1]— это кортеж имён атрибутов, передаваемых по ключевым словам;STACK[-2]— класс, с которым выполняется сопоставление;STACK[-3]— объект, который сопоставляется. count — число позиционных подшаблонов.Снимает
STACK[-1],STACK[-2]иSTACK[-3]. ЕслиSTACK[-3]является экземпляромSTACK[-2]и имеет позиционные и именованные атрибуты, требуемые значениями count иSTACK[-1], помещает в стек кортеж извлечённых атрибутов. В противном случае помещает в стек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(delta) -
Эквивалентна
STACK[-1] = STACK[-2].send(STACK[-1]). Используется в инструкцияхyield fromиawait.Если вызов вызывает
StopIteration, снимает верхнее значение со стека, помещает в стек атрибутvalueисключения и увеличивает счётчик байт-кода на delta.Добавлено в версии 3.11.
-
HAVE_ARGUMENT -
На самом деле это не инструкция. Она обозначает границу между инструкциями в диапазоне [0,255], которые не используют аргумент, и теми, которые его используют (соответственно,
< HAVE_ARGUMENTи>= HAVE_ARGUMENT).Если приложение использует псевдоинструкции, используйте вместо этого набор
hasarg.Изменено в версии 3.6: Теперь у каждой инструкции есть аргумент, но инструкции
< HAVE_ARGUMENTего игнорируют. Ранее аргумент был только у инструкций>= HAVE_ARGUMENT.Изменено в версии 3.12: В модуль
disдобавлены псевдоинструкции; для них сравнение сHAVE_ARGUMENTне позволяет определить, используют ли они свой аргумент.
-
CALL_INTRINSIC_1 -
Вызывает встроенную функцию с одним аргументом. Передаёт
STACK[-1]в качестве аргумента и присваиваетSTACK[-1]результат. Используется для реализации функциональности, не критичной к производительности.Операнд определяет, какая встроенная функция вызывается:
Операнд
Описание
INTRINSIC_1_INVALIDНедопустимо
INTRINSIC_PRINTВыводит аргумент в стандартный вывод. Используется в REPL.
INTRINSIC_IMPORT_STARВыполняет
import *для указанного модуля.INTRINSIC_STOPITERATION_ERRORИзвлекает возвращаемое значение из исключения
StopIteration.INTRINSIC_ASYNC_GEN_WRAPОборачивает значение асинхронного генератора
INTRINSIC_UNARY_POSITIVEВыполняет унарную операцию
+INTRINSIC_LIST_TO_TUPLEПреобразует список в кортеж
INTRINSIC_TYPEVARСоздаёт
typing.TypeVarINTRINSIC_PARAMSPECСоздаёт
typing.ParamSpecINTRINSIC_TYPEVARTUPLEСоздаёт
typing.TypeVarTupleINTRINSIC_SUBSCRIPT_GENERICВозвращает
typing.Genericс аргументом в качестве индексаINTRINSIC_TYPEALIASСоздаёт
typing.TypeAliasType; используется в инструкцииtype. Аргумент — это кортеж из имени псевдонима типа, параметров типа и значения.Добавлено в версии 3.12.
-
CALL_INTRINSIC_2 -
Вызывает встроенную функцию с двумя аргументами. Используется для реализации функциональности, не критичной к производительности:
arg2 = STACK.pop() arg1 = STACK.pop() result = intrinsic2(arg1, arg2) STACK.push(result)
Операнд определяет, какая встроенная функция вызывается:
Операнд
Описание
INTRINSIC_2_INVALIDНедопустимо
INTRINSIC_PREP_RERAISE_STARВычисляет
ExceptionGroup, которое нужно вызвать изtry-except*.INTRINSIC_TYPEVAR_WITH_BOUNDСоздаёт
typing.TypeVarс ограничением.INTRINSIC_TYPEVAR_WITH_CONSTRAINTSСоздаёт
typing.TypeVarс ограничениями.INTRINSIC_SET_FUNCTION_TYPE_PARAMSУстанавливает атрибут
__type_params__функции.Добавлено в версии 3.12.
Псевдоинструкции
Эти коды операций не встречаются в байткоде Python. Они используются компилятором, но заменяются реальными кодами операций или удаляются до генерации байткода.
-
SETUP_FINALLY(target) -
Настраивает обработчик исключений для следующего блока кода. Если возникает исключение, уровень стека значений восстанавливается до текущего состояния, а управление передаётся обработчику исключений в
target.
-
SETUP_CLEANUP(target) -
Подобно
SETUP_FINALLY, но в случае исключения также помещает в стек последнюю инструкцию (lasti), чтобыRERAISEмогла её восстановить. Если возникает исключение, уровень стека значений и последняя инструкция в кадре восстанавливаются до текущего состояния, а управление передаётся обработчику исключений вtarget.
-
SETUP_WITH(target) -
Подобно
SETUP_CLEANUP, но в случае исключения перед передачей управления обработчику исключений вtargetиз стека извлекается ещё один элемент.Этот вариант используется в конструкциях
withиasync with, которые помещают в стек возвращаемое значение метода контекстного менеджера__enter__()или__aenter__().
-
POP_BLOCK -
Отмечает конец блока кода, связанного с последней инструкцией
SETUP_FINALLY,SETUP_CLEANUPилиSETUP_WITH.
-
JUMP
-
JUMP_NO_INTERRUPT -
Ненаправленные относительные инструкции перехода, которые ассемблер заменяет их направленными вариантами (вперёд/назад).
-
LOAD_METHOD -
Оптимизированный поиск несвязанного метода. Генерируется как код операции
LOAD_ATTRс установленным флагом в аргументе.
Коллекции кодов операций
Эти коллекции предоставляются для автоматического анализа инструкций байткода:
Изменено в версии 3.12: Теперь коллекции также содержат псевдоинструкции и инструментированные инструкции. Это коды операций со значениями >= MIN_PSEUDO_OPCODE и >= MIN_INSTRUMENTED_OPCODE.
-
dis.opname -
Последовательность имён операций, индексируемая с помощью байткода.
-
dis.opmap -
Словарь, сопоставляющий имена операций с кодами байткода.
-
dis.cmp_op -
Последовательность имён всех операций сравнения.
-
dis.hasarg -
Последовательность кодов байткода, использующих свой аргумент.
Добавлено в версии 3.12.
-
dis.hasconst -
Последовательность кодов байткода, обращающихся к константе.
-
dis.hasfree -
Последовательность кодов байткода, обращающихся к свободной переменной. В данном контексте «свободная» относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылается эта область. Сюда не входят ссылки на глобальную область видимости или встроенные области видимости.
-
dis.hasname -
Последовательность кодов байткода, обращающихся к атрибуту по имени.
-
dis.hasjrel -
Последовательность кодов байткода, имеющих относительную цель перехода.
-
dis.hasjabs -
Последовательность кодов байткода, имеющих абсолютную цель перехода.
-
dis.haslocal -
Последовательность кодов байткода, обращающихся к локальной переменной.
-
dis.hascompare -
Последовательность кодов байткода для логических операций.
-
dis.hasexc -
Последовательность кодов байткода, задающих обработчик исключений.
Добавлено в версии 3.12.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/dis.html