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 не влияет на прямые переходы, но его необходимо учитывать при анализе обратных переходов.
Изменено в версии 3.13: В выводе для целей переходов и обработчиков исключений отображаются логические метки, а не смещения инструкций. Добавлены параметр командной строки -O и аргумент show_offsets.
Пример: дана функция myfunc():
def myfunc(alist):
return len(alist)
для отображения дизассемблированного кода myfunc() можно использовать следующую команду:
>>> dis.dis(myfunc)
2 RESUME 0
3 LOAD_GLOBAL 1 (len + NULL)
LOAD_FAST_BORROW 0 (alist)
CALL 1
RETURN_VALUE
(«2» — это номер строки).
Интерфейс командной строки
Модуль dis можно запустить как скрипт из командной строки:
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
Поддерживаются следующие параметры:
-
-h, --help -
Показать справку по использованию и завершить работу.
-
-C, --show-caches -
Показать встроенные кэши.
Добавлено в версии 3.13.
-
-O, --show-offsets -
Показать смещения инструкций.
Добавлено в версии 3.13.
-
-P, --show-positions -
Показать позиции инструкций в исходном коде.
Добавлено в версии 3.14.
-
-S, --specialized -
Показать специализированный байт-код.
Добавлено в версии 3.14.
Если указан infile, его дизассемблированный код будет выведен в stdout. В противном случае дизассемблирование выполняется для скомпилированного исходного кода, полученного из stdin.
Анализ байт-кода
Добавлено в версии 3.4.
API анализа байт-кода позволяет обернуть фрагменты кода Python в объект Bytecode, предоставляющий удобный доступ к сведениям о скомпилированном коде.
-
class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False) -
Анализирует байт-код, соответствующий функции, генератору, асинхронному генератору, сопрограмме, методу, строке исходного кода или объекту кода (возвращаемому функцией
compile()).Это удобная обёртка для многих перечисленных ниже функций, в первую очередь для
get_instructions(), поскольку при переборе экземпляраBytecodeоперации байт-кода возвращаются в виде экземпляровInstruction.Если first_line не равно
None, оно указывает номер строки, который следует указать для первой строки исходного кода в дизассемблированном коде. В противном случае информация об исходных строках (если она есть) берётся непосредственно из дизассемблированного объекта кода.Если current_offset не равно
None, оно указывает смещение инструкции в дизассемблированном коде. Если задать это значение,dis()отобразит маркер «текущая инструкция» рядом с указанным кодом операции.Если show_caches равно
True,dis()отобразит встроенные записи кэша, используемые интерпретатором для специализации байт-кода.Если adaptive равно
True,dis()отобразит специализированный байт-код, который может отличаться от исходного.Если show_offsets равно
True,dis()включит в вывод смещения инструкций.Если show_positions равно
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.
Изменено в версии 3.13: Добавлен параметр show_offsets
Изменено в версии 3.14: Добавлен параметр show_positions.
-
Пример:
>>> bytecode = dis.Bytecode(myfunc) >>> for instr in bytecode: ... print(instr.opname) ... RESUME LOAD_GLOBAL LOAD_FAST_BORROW 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, show_offsets=False, show_positions=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.
Изменено в версии 3.13: Добавлен параметр show_offsets.
Изменено в версии 3.14: Добавлен параметр show_positions.
-
dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False) -
Дизассемблирует функцию на вершине стека трассировки, используя последнюю трассировку, если аргумент не передан. Инструкция, вызвавшая исключение, отмечается.
Дизассемблирование записывается в виде текста в указанный аргумент file, если он задан, и в
sys.stdoutв противном случае.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
Изменено в версии 3.13: Добавлен параметр show_offsets.
Изменено в версии 3.14: Добавлен параметр show_positions.
-
dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False) -
dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False) -
Дизассемблирует объект кода, отмечая последнюю инструкцию, если задан lasti. Вывод разделён на следующие столбцы:
- местоположение инструкции в исходном коде. Если show_positions равно true, отображается полная информация о местоположении. В противном случае (по умолчанию) выводится только номер строки.
- текущая инструкция, обозначенная как
-->, - инструкция с меткой, обозначенная как
>>, - адрес инструкции,
- имя кода операции,
- параметры операции и
- интерпретация параметров в скобках.
При интерпретации параметров распознаются имена локальных и глобальных переменных, значения констант, цели переходов и операторы сравнения.
Дизассемблирование записывается в виде текста в указанный аргумент file, если он задан, и в
sys.stdoutв противном случае.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
Изменено в версии 3.13: Добавлен параметр show_offsets.
Изменено в версии 3.14: Добавлен параметр show_positions.
-
dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False) -
Возвращает итератор по инструкциям указанной функции, метода, строки исходного кода или объекта кода.
Итератор формирует последовательность именованных кортежей
Instruction, содержащих сведения о каждой операции в указанном коде.Если first_line не равно
None, оно указывает номер строки, который следует указать для первой строки исходного кода в дизассемблированном коде. В противном случае информация об исходных строках (если она есть) берётся непосредственно из дизассемблированного объекта кода.Параметр adaptive работает так же, как в
dis().Добавлено в версии 3.4.
Изменено в версии 3.11: Добавлены параметры show_caches и adaptive.
Изменено в версии 3.13: Параметр show_caches объявлен устаревшим и не оказывает действия. Итератор формирует экземпляры
Instructionс заполненным полем cache_info (независимо от значения show_caches) и больше не формирует отдельные элементы для записей кэша.
-
dis.findlinestarts(code) -
Эта функция-генератор использует метод
co_lines()объекта кода code, чтобы найти смещения, соответствующие началу строк в исходном коде. Они выдаются в виде пар(offset, lineno).Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.
Изменено в версии 3.10: Вместо атрибутов
co_firstlinenoиco_lnotabобъекта кода используется методco_lines()из PEP 626.Изменено в версии 3.13: Для байт-кода, не соответствующего строкам исходного кода, номера строк могут быть
None.
-
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.
Изменено в версии 3.13: Если
opargне указан (или равноNone), теперь возвращается влияние на стек дляoparg=0. Ранее это приводило к ошибке для кодов операций, использующих свой аргумент. Кроме того, передача целого числаopargбольше не считается ошибкой, еслиopcodeего не использует; в этом случаеopargигнорируется.
Инструкции байт-кода Python
Функция get_instructions() и класс Bytecode предоставляют сведения об инструкциях байт-кода в виде экземпляров Instruction:
-
class dis.Instruction -
Сведения об операции байт-кода
-
opcode -
числовой код операции, соответствующий значениям кодов операций, перечисленным ниже, и значениям байт-кода в коллекциях кодов операций.
-
opname -
понятное человеку название операции
-
baseopcode -
числовой код базовой операции, если операция специализированная; в противном случае совпадает с
opcode
-
baseopname -
понятное человеку название базовой операции, если операция специализированная; в противном случае совпадает с
opname
-
arg -
числовой аргумент операции (если есть), в противном случае
None
-
oparg -
синоним
arg
-
argval -
вычисленное значение аргумента (если есть), в противном случае
None
-
argrepr -
понятное человеку описание аргумента операции (если есть), в противном случае пустая строка.
-
offset -
начальный индекс операции в последовательности байт-кода
-
start_offset -
начальный индекс операции в последовательности байт-кода с учётом предшествующих операций
EXTENDED_ARG, если они есть; в противном случае совпадает сoffset
-
cache_offset -
начальный индекс записей кэша, следующих за операцией
-
end_offset -
конечный индекс записей кэша, следующих за операцией
-
starts_line -
True, если этот код операции начинает строку исходного кода, в противном случаеFalse
-
line_number -
номер строки исходного кода, связанной с этим кодом операции (если есть), в противном случае
None
-
is_jump_target -
True, если сюда выполняется переход из другого кода, в противном случаеFalse
-
jump_target -
индекс байт-кода, на который выполняется переход, если это операция перехода, в противном случае
None
-
positions -
объект
dis.Positions, содержащий начальные и конечные позиции, охватываемые этой инструкцией.
-
cache_info -
Сведения о записях кэша этой инструкции в виде троек формата
(name, size, data), гдеnameиsizeописывают формат кэша, а data — его содержимое.cache_infoравноNone, если у инструкции нет кэшей.
Добавлено в версии 3.4.
Изменено в версии 3.11: Добавлено поле
positions.Изменено в версии 3.13: Изменено поле
starts_line.Добавлены поля
start_offset,cache_offset,end_offset,baseopname,baseopcode,jump_target,oparg,line_numberиcache_info. -
-
class dis.Positions -
Если сведения недоступны, некоторые поля могут иметь значение
None.-
lineno
-
end_lineno
-
col_offset
-
end_col_offset
Добавлено в версии 3.11.
-
В настоящее время компилятор Python генерирует следующие инструкции байт-кода.
Общие инструкции
Далее мы будем называть стек интерпретатора STACK и описывать операции над ним так, как если бы он был списком Python. Вершине стека соответствует STACK[-1] в этом языке.
-
NOP -
Инструкция, не выполняющая никаких действий. Используется оптимизатором байт-кода в качестве заполнителя, а также для генерации событий трассировки строк.
-
NOT_TAKEN -
Инструкция, не выполняющая никаких действий. Используется интерпретатором для регистрации событий
BRANCH_LEFTиBRANCH_RIGHTдляsys.monitoring.Добавлено в версии 3.14.
-
POP_ITER -
Удаляет итератор с вершины стека.
Добавлено в версии 3.14.
-
POP_TOP -
Удаляет элемент с вершины стека:
STACK.pop()
-
END_FOR -
Удаляет элемент с вершины стека. Эквивалентно
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].Изменено в версии 3.13: Теперь эта инструкция требует операнд типа
boolбез подклассов.
-
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.
-
TO_BOOL -
Реализует
STACK[-1] = bool(STACK[-1]).Добавлено в версии 3.13.
Бинарные операции и операции с присваиванием
Бинарные операции удаляют два верхних элемента стека (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.
Изменено в версии 3.14: При oparg :
NB_SUBSCRреализует бинарный доступ по индексу (заменяет код операцииBINARY_SUBSCR)
-
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() value = 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.
Разные коды операций
-
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]вызывающему коду функции.
-
YIELD_VALUE -
Выдаёт
STACK.pop()из генератора.Изменено в версии 3.11: oparg задаёт глубину стека.
Изменено в версии 3.12: oparg задаёт глубину блока исключения для эффективного закрытия генераторов.
Изменено в версии 3.13: oparg равен
1, если эта инструкция является частью yield-from или await, и0в противном случае.
-
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_COMMON_CONSTANT -
Помещает общую константу в стек. Интерпретатор содержит жёстко заданный список констант, поддерживаемых этой инструкцией. Используется инструкцией
assertдля загрузкиAssertionError.Добавлено в версии 3.14.
-
LOAD_BUILD_CLASS -
Помещает
builtins.__build_class__()в стек. Позднее он вызывается для создания класса.
-
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
-
DELETE_ATTR(namei) -
Реализует:
obj = STACK.pop() del obj.name
-
STORE_GLOBAL(namei) -
Работает как
STORE_NAME, но сохраняет имя как глобальное.
-
DELETE_GLOBAL(namei) -
Работает как
DELETE_NAME, но удаляет глобальное имя.
-
LOAD_CONST(consti) -
Помещает
co_consts[consti]в стек.
-
LOAD_SMALL_INT(i) -
Помещает целое число
iв стек.iдолжно находиться вrange(256)Добавлено в версии 3.14.
-
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_TEMPLATE -
Создаёт новый экземпляр
Templateиз кортежа строк и кортежа интерполяций и помещает полученный объект в стек:interpolations = STACK.pop() strings = STACK.pop() STACK.append(_build_template(strings, interpolations))
Добавлено в версии 3.14.
-
BUILD_INTERPOLATION(format) -
Создаёт новый экземпляр
Interpolationиз значения и его исходного выражения и помещает полученный объект в стек.Если преобразование или спецификация формата отсутствуют,
formatустанавливается в2.Если установлен младший бит
format, это означает, что интерполяция содержит спецификацию формата.Если
format >> 2не равно нулю, это означает, что интерполяция содержит преобразование. Значениеformat >> 2— это тип преобразования (0для отсутствия преобразования,1для!s,2для!rи3для!a):conversion = format >> 2 if format & 1: format_spec = STACK.pop() else: format_spec = None expression = STACK.pop() value = STACK.pop() STACK.append(_build_interpolation(value, expression, conversion, format_spec))Добавлено в версии 3.14.
-
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_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илиCALL_KWиспользует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 >> 5]. Если установлен пятый бит снизу вopname(opname & 16), результат следует привести к типуbool.Изменено в версии 3.13: Пятый бит снизу аргумента опкода теперь указывает на принудительное преобразование к
bool.
-
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: Аргумент опкода теперь задаёт относительное смещение, а не абсолютную цель перехода. Этот опкод является псевдоинструкцией, которая в итоговом байткоде заменяется направленными версиями (вперёд/назад).
Изменено в версии 3.12: Это больше не псевдоинструкция.
Изменено в версии 3.13: Теперь этой инструкции требуется операнд точного типа
bool.
-
POP_JUMP_IF_FALSE(delta) -
Если
STACK[-1]ложно, увеличивает счётчик байткода на delta.STACK[-1]извлекается из стека.Изменено в версии 3.11: Аргумент опкода теперь задаёт относительное смещение, а не абсолютную цель перехода. Этот опкод является псевдоинструкцией, которая в итоговом байткоде заменяется направленными версиями (вперёд/назад).
Изменено в версии 3.12: Это больше не псевдоинструкция.
Изменено в версии 3.13: Теперь этой инструкции требуется операнд точного типа
bool.
-
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_BORROW(var_num) -
Помещает в стек заимствованную ссылку на локальную переменную
co_varnames[var_num].Добавлено в версии 3.14.
-
LOAD_FAST_LOAD_FAST(var_nums) -
Помещает в стек ссылки на
co_varnames[var_nums >> 4]иco_varnames[var_nums & 15].Добавлено в версии 3.13.
-
LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums) -
Помещает в стек заимствованные ссылки на
co_varnames[var_nums >> 4]иco_varnames[var_nums & 15].Добавлено в версии 3.14.
-
LOAD_FAST_CHECK(var_num) -
Помещает в стек ссылку на локальную переменную
co_varnames[var_num], вызывая исключениеUnboundLocalError, если локальная переменная не была инициализирована.Добавлено в версии 3.12.
-
LOAD_FAST_AND_CLEAR(var_num) -
Помещает в стек ссылку на локальную переменную
co_varnames[var_num](или помещает в стекNULL, если локальная переменная не была инициализирована) и устанавливаетco_varnames[var_num]вNULL.Добавлено в версии 3.12.
-
STORE_FAST(var_num) -
Сохраняет
STACK.pop()в локальную переменнуюco_varnames[var_num].
-
STORE_FAST_STORE_FAST(var_nums) -
Сохраняет
STACK[-1]вco_varnames[var_nums >> 4]иSTACK[-2]вco_varnames[var_nums & 15].Добавлено в версии 3.13.
-
STORE_FAST_LOAD_FAST(var_nums) -
Сохраняет
STACK.pop()в локальную переменнуюco_varnames[var_nums >> 4]и помещает в стек ссылку на локальную переменнуюco_varnames[var_nums & 15].Добавлено в версии 3.13.
-
DELETE_FAST(var_num) -
Удаляет локальную переменную
co_varnames[var_num].
-
MAKE_CELL(i) -
Создаёт новую ячейку в слоте
i. Если слот не пуст, его значение сохраняется в новой ячейке.Добавлено в версии 3.11.
-
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. В стеке находятся (в порядке возрастания):- Вызываемый объект
-
selfилиNULL - Остальные позиционные аргументы
argc— общее количество позиционных аргументов без учётаself.CALLизвлекает из стека все аргументы и вызываемый объект, вызывает этот объект с указанными аргументами и помещает в стек возвращённое им значение.Добавлено в версии 3.11.
Изменено в версии 3.13: Вызываемый объект теперь всегда находится в одной и той же позиции стека.
Изменено в версии 3.13: Вызовы с именованными аргументами теперь обрабатываются опкодом
CALL_KW.
-
CALL_KW(argc) -
Вызывает вызываемый объект с количеством аргументов, заданным в
argc, включая один или несколько именованных аргументов. В стеке находятся (в порядке возрастания):- Вызываемый объект
-
selfилиNULL - Остальные позиционные аргументы
- Именованные аргументы
tupleс именами именованных аргументов
argc— общее количество позиционных и именованных аргументов без учётаself. Длина кортежа с именами именованных аргументов равна количеству именованных аргументов.CALL_KWизвлекает из стека все аргументы, имена ключевых аргументов и вызываемый объект, вызывает этот объект с указанными аргументами и помещает в стек возвращённое им значение.Добавлено в версии 3.13.
-
CALL_FUNCTION_EX(flags) -
Вызывает вызываемый объект с переменным набором позиционных и именованных аргументов. Если установлен младший бит flags, на вершине стека находится объект-отображение с дополнительными именованными аргументами. Перед вызовом вызываемого объекта объект-отображение и итерируемый объект распаковываются, а их содержимое передаётся в качестве именованных и позиционных аргументов соответственно.
CALL_FUNCTION_EXизвлекает из стека все аргументы и вызываемый объект, вызывает этот объект с указанными аргументами и помещает в стек возвращённое им значение.Добавлено в версии 3.6.
-
PUSH_NULL -
Помещает
NULLв стек. Используется в последовательности вызовов для соответствияNULL, помещённому в стек инструкциейLOAD_METHODдля вызовов, не являющихся вызовами методов.Добавлено в версии 3.11.
-
MAKE_FUNCTION -
Помещает в стек новый объект функции, созданный из объекта кода в
STACK[-1].Изменено в версии 3.10: Значение флага
0x04— это кортеж строк, а не словарьИзменено в версии 3.11: Квалифицированное имя в
STACK[-1]удалено.Изменено в версии 3.13: Дополнительные атрибуты функции в стеке, задававшиеся флагами oparg, удалены. Теперь для них используется
SET_FUNCTION_ATTRIBUTE.
-
SET_FUNCTION_ATTRIBUTE(flag) -
Устанавливает атрибут объекта функции. Ожидает функцию в
STACK[-1]и значение атрибута для установки вSTACK[-2]; извлекает оба значения и оставляет функцию вSTACK[-1]. Флаг определяет, какой атрибут следует установить:-
0x01кортеж значений по умолчанию для позиционных параметров и параметров, передаваемых по имени или позиции, в позиционном порядке -
0x02словарь значений по умолчанию для параметров, передаваемых только по имени -
0x04кортеж строк с аннотациями параметров -
0x08кортеж, содержащий ячейки для свободных переменных, образующих замыкание -
0x10функцию аннотирования объекта функции
Добавлено в версии 3.13.
Изменено в версии 3.14: Добавлено
0x10для указания функции аннотирования объекта функции. -
-
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, формирующих аргумент длиной от двух до четырёх байт.
-
CONVERT_VALUE(oparg) -
Преобразует значение в строку в зависимости от
oparg:value = STACK.pop() result = func(value) STACK.append(result)
-
oparg == 1: вызываетstr()для value -
oparg == 2: вызываетrepr()для value -
oparg == 3: вызываетascii()для value
Используется для реализации форматированных строковых литералов (f-строк).
Добавлено в версии 3.13.
-
-
FORMAT_SIMPLE -
Форматирует значение на вершине стека:
value = STACK.pop() result = value.__format__("") STACK.append(result)Используется для реализации форматированных строковых литералов (f-строк).
Добавлено в версии 3.13.
-
FORMAT_WITH_SPEC -
Форматирует заданное значение с помощью заданной спецификации формата:
spec = STACK.pop() value = STACK.pop() result = value.__format__(spec) STACK.append(result)
Используется для реализации форматированных строковых литералов (f-строк).
Добавлено в версии 3.13.
-
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(context) -
Ничего не делает. Выполняет внутреннюю трассировку, отладочные проверки и проверки оптимизации.
Операнд
contextсостоит из двух частей. Два младших бита указывают, где происходитRESUME:-
0начало функции, которая не является генератором, сопрограммой или асинхронным генератором -
1после выраженияyield -
2после выраженияyield from -
3после выраженияawait
Следующий бит равен
1, если RESUME находится на уровне вложенности исключений1, и0в противном случае.Добавлено в версии 3.11.
Изменено в версии 3.13: Значение oparg изменено: теперь оно также содержит информацию об уровне вложенности исключений
-
-
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не позволяет определить, используют ли они аргумент.Устарело с версии 3.13: Вместо этого используйте
hasarg.
-
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.append(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.
-
LOAD_SPECIAL -
Выполняет поиск специального метода в
STACK[-1]. Еслиtype(STACK[-1]).__xxx__является методом, оставляетtype(STACK[-1]).__xxx__; STACK[-1]в стеке. Еслиtype(STACK[-1]).__xxx__не является методом, оставляетSTACK[-1].__xxx__; NULLв стеке.Добавлено в версии 3.14.
Псевдоинструкции
Эти инструкции не встречаются в байт-коде 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.
-
LOAD_CONST_IMMORTAL(consti) -
Работает как
LOAD_CONST, но эффективнее для бессмертных объектов.
-
JUMP -
JUMP_NO_INTERRUPT -
Инструкции относительного перехода без заданного направления, которые ассемблер заменяет соответствующими инструкциями с заданным направлением (вперёд/назад).
-
JUMP_IF_TRUE -
JUMP_IF_FALSE -
Условные переходы, не влияющие на стек. Заменяются последовательностью
COPY 1,TO_BOOL,POP_JUMP_IF_TRUE/FALSE.
-
LOAD_CLOSURE(i) -
Помещает ссылку на ячейку, содержащуюся в слоте
iхранилища «быстрых локальных переменных».Обратите внимание, что
LOAD_CLOSUREзаменяется наLOAD_FASTассемблером.Изменено в версии 3.13: Теперь эта инструкция является псевдоинструкцией.
Коллекции инструкций
Эти коллекции предназначены для автоматического анализа инструкций байт-кода:
Изменено в версии 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.hasjump -
Последовательность байт-кодов, имеющих цель перехода. Все переходы относительные.
Добавлено в версии 3.13.
-
dis.haslocal -
Последовательность байт-кодов, обращающихся к локальной переменной.
-
dis.hascompare -
Последовательность байт-кодов логических операций.
-
dis.hasexc -
Последовательность байт-кодов, устанавливающих обработчик исключений.
Добавлено в версии 3.12.
-
dis.hasjrel -
Последовательность байт-кодов с относительной целью перехода.
Устарело с версии 3.13: Теперь все переходы относительные. Используйте
hasjump.
-
dis.hasjabs -
Последовательность байт-кодов с абсолютной целью перехода.
Устарело с версии 3.13: Теперь все переходы относительные. Этот список пуст.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/dis.html