Содержание страницы
dis – Дизассемблер байт-кода Python¶dis – Disassembler for Python bytecode
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байт-кода CPython путём
eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход,
определён в файле Include/opcode.h и используется компилятором и
интерпретатором.
Особенность реализации CPython: Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.
Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байт зависело от инструкции.
Изменено в версии 3.10: Аргументом инструкций перехода, обработки исключений и циклов теперь является смещение инструкции, а не смещение байта.
Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими записями встроенного кэша,
которые имеют форму инструкций CACHE. Эти инструкции
по умолчанию скрыты, но их можно показать, передав show_caches=True
любой dis утилите. Кроме того, интерпретатор теперь адаптирует
байт-код для специализации под разные условия выполнения.
Адаптивный байт-код можно показать, передав adaptive=True.
Пример: Дана функция myfunc():
def myfunc(alist):
return len(alist)
следующую команду можно использовать для отображения дизассемблирования
myfunc():
>>> dis.dis(myfunc)
2 0 RESUME 0
3 2 LOAD_GLOBAL 1 (NULL + len)
14 LOAD_FAST 0 (alist)
16 PRECALL 1
20 CALL 1
30 RETURN_VALUE
(«2» – это номер строки).
Интерфейс командной строки¶Command-line interface
Модуль dis можно вызвать как сценарий из командной строки:
python -m dis [-h] [-C] [infile]
Принимаются следующие опции:
- -h, --help¶
Показать справку и выйти.
- -C, --show-caches¶
Показать встроенные кэши.
Если указан infile, его дизассемблированный код выводится в stdout.
В противном случае дизассемблирование выполняется для скомпилированного исходного кода, полученного из stdin.
Анализ байт-кода¶Bytecode analysis
Новое в версии 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()будет отображать записи inline-кэша, используемые интерпретатором для специализации байткода.Если adaptive равно
True,dis()будет отображать специализированный байткод, который может отличаться от исходного.- classmethod from_traceback(tb, *, show_caches=False)¶
Создаёт экземпляр
Bytecodeиз заданного traceback, устанавливая 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
PRECALL
CALL
RETURN_VALUE
Функции анализа¶Analysis functions
Модуль 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)¶
Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.
Результат дисассемблирования выводится в виде текста в указанный аргумент 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: Метод PEP 626
co_lines()используется вместо атрибутовco_firstlinenoиco_lnotabобъекта кода.
- dis.findlabels(code)¶
Обнаруживает все смещения в сырой скомпилированной строке байткода code, которые являются целями переходов, и возвращает список этих смещений.
- dis.stack_effect(opcode, oparg=None, *, jump=None)¶
Вычисляет эффект стека для opcode с аргументом oparg.
Если код имеет цель перехода и jump равен
True,stack_effect()возвращает эффект стека при переходе. Если jump равенFalse, возвращается эффект стека при отсутствии перехода. А если jump равенNone(по умолчанию), возвращается максимальный эффект стека для обоих случаев.Новое в версии 3.4.
Изменено в версии 3.8: Добавлен параметр jump.
Инструкции байткода Python¶Python Bytecode Instructions
Функция get_instructions() и класс Bytecode предоставляют сведения об инструкциях байткода в виде экземпляров Instruction:
- class dis.Instruction¶
Подробности об операции байткода
- opcode¶
Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в коллекциях 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 генерирует следующие инструкции байткода.
Общие инструкции
- NOP¶
Код, который ничего не делает. Используется оптимизатором байткода как заполнитель, а также для генерации событий трассировки строк.
- POP_TOP¶
Удаляет элемент с вершины стека (TOS).
- COPY(i)¶
Помещает элемент с индексом i на вершину стека. Элемент не удаляется из своего исходного положения.
Новое в версии 3.11.
- SWAP(i)¶
Меняет местами TOS и элемент на позиции i.
Новое в версии 3.11.
- CACHE¶
Вместо того чтобы быть реальной инструкцией, этот опкод используется для разметки дополнительного пространства, чтобы интерпретатор мог кэшировать полезные данные непосредственно в байткоде. Он автоматически скрывается всеми утилитами
dis, но может быть просмотрен с помощьюshow_caches=True.Логически это пространство является частью предыдущей инструкции. Многие опкоды ожидают, что за ними следует точное количество кэшей, и будут указывать интерпретатору пропускать их во время выполнения.
Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует проявлять большую осторожность при чтении или изменении сырого адаптивного байткода, содержащего ускоренные данные.
Новое в версии 3.11.
Унарные операции
Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.
- UNARY_POSITIVE¶
Реализует
TOS = +TOS.
- UNARY_NEGATIVE¶
Реализует
TOS = -TOS.
- UNARY_NOT¶
Реализует
TOS = not TOS.
- UNARY_INVERT¶
Реализует
TOS = ~TOS.
- GET_ITER¶
Реализует
TOS = iter(TOS).
- GET_YIELD_FROM_ITER¶
Если
TOSявляется объектом генераторный итератор или корутина, он остаётся без изменений. В противном случае реализуетTOS = iter(TOS).Новое в версии 3.5.
Бинарные операции и операции на месте
Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.
Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.
- BINARY_OP(op)¶
Реализует бинарные операторы и операторы на месте (в зависимости от значения op).
Новое в версии 3.11.
- BINARY_SUBSCR¶
Реализует
TOS = TOS1[TOS].
- STORE_SUBSCR¶
Реализует
TOS1[TOS] = TOS2.
- DELETE_SUBSCR¶
Реализует
del TOS1[TOS].
Коды операций корутин
- GET_AWAITABLE(where)¶
Реализует
TOS = get_awaitable(TOS), гдеget_awaitable(o)возвращаетo, еслиoявляется объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешаетo.__await__.Если операнд
whereне равен нулю, он указывает, где находится инструкция :1После вызова__aenter__2После вызова__aexit__
Новое в версии 3.5.
Изменено в версии 3.11: Ранее эта инструкция не имела oparg.
- GET_AITER¶
Реализует
TOS = TOS.__aiter__().Новое в версии 3.5.
Изменено в версии 3.7: Возврат ожидаемых объектов из
__aiter__больше не поддерживается.
- GET_ANEXT¶
Помещает
get_awaitable(TOS.__anext__())в стек. См.GET_AWAITABLEдля подробностей оget_awaitable.Новое в версии 3.5.
- END_ASYNC_FOR¶
Завершает цикл
async for. Обрабатывает исключение, возникшее при ожидании следующего элемента. В стеке находятся асинхронный итерируемый объект в TOS1 и возникшее исключение в TOS. Оба извлекаются. Если исключение не являетсяStopAsyncIteration, оно возбуждается повторно.Новое в версии 3.8.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.
- BEFORE_ASYNC_WITH¶
Извлекает
__aenter__и__aexit__из объекта на вершине стека. Помещает__aexit__и результат__aenter__()в стек.Новое в версии 3.5.
Прочие опкоды
- PRINT_EXPR¶
Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью
POP_TOP.
- SET_ADD(i)¶
Вызывает
set.add(TOS1[-i], TOS). Используется для реализации множественных включений (set comprehensions).
- LIST_APPEND(i)¶
Вызывает
list.append(TOS1[-i], TOS). Используется для реализации списковых включений (list comprehensions).
- MAP_ADD(i)¶
Вызывает
dict.__setitem__(TOS1[-i], TOS1, TOS). Используется для реализации словарных включений (dict comprehensions).Новое в версии 3.1.
Изменено в версии 3.8: Значением отображения теперь является TOS, а ключом – TOS1. Ранее они были переставлены.
Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.
- RETURN_VALUE¶
Возвращает TOS вызывающей стороне функции.
- YIELD_VALUE¶
Извлекает TOS и возвращает его из генератора.
- SETUP_ANNOTATIONS¶
Проверяет, определён ли
__annotations__вlocals(); если нет, он устанавливается в пустойdict. Этот опкод генерируется, только если тело класса или модуля статически содержит аннотации переменных.Новое в версии 3.6.
- IMPORT_STAR¶
Загружает все имена, не начинающиеся с
'_', из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализуетfrom module import *.
- POP_EXCEPT¶
Извлекает значение из стека, которое используется для восстановления состояния исключения.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.
- RERAISE¶
Повторно возбуждает исключение, находящееся на вершине стека. Если oparg не равен нулю, извлекает из стека дополнительное значение, которое используется для установки
f_lastiтекущего фрейма.Новое в версии 3.9.
Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.
- PUSH_EXC_INFO¶
Извлекает значение из стека. Помещает текущее исключение на вершину стека. Возвращает обратно в стек то значение, которое было извлечено. Используется в обработчиках исключений.
Новое в версии 3.11.
- CHECK_EXC_MATCH¶
Выполняет сопоставление исключений для
except. Проверяет, является ли TOS1 исключением, соответствующим TOS. Извлекает TOS и помещает логический результат проверки в стек.Новое в версии 3.11.
- CHECK_EG_MATCH¶
Выполняет сопоставление исключений для
except*. Применяетsplit(TOS)к группе исключений, представляющей TOS1.В случае совпадения извлекает из стека два элемента и помещает несовпадающую подгруппу (
Noneпри полном совпадении), а затем совпадающую подгруппу. При отсутствии совпадения извлекает один элемент (тип сопоставления) и помещаетNone.Новое в версии 3.11.
- PREP_RERAISE_STAR¶
Объединяет списки возбуждённых и повторно возбуждённых исключений из TOS в группу исключений для распространения из блока try-except*. Использует исходную группу исключений из TOS1 для восстановления структуры повторно возбуждённых исключений. Извлекает два элемента из стека и помещает исключение для повторного возбуждения или
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(delta)¶
Этот опкод выполняет несколько операций перед началом блока with. Сначала, он загружает
__exit__()из контекстного менеджера и помещает его в стек для последующего использованияWITH_EXCEPT_START. Затем, вызывается__enter__(). Наконец, результат вызова метода__enter__()помещается в стек.Новое в версии 3.11.
- GET_LEN¶
Помещает
len(TOS)в стек.Новое в версии 3.10.
- MATCH_MAPPING¶
Если TOS является экземпляром
collections.abc.Mapping(или, более технически: если у него установлен флагPy_TPFLAGS_MAPPINGвtp_flags), помещаетTrueв стек. В противном случае помещаетFalse.Новое в версии 3.10.
- MATCH_SEQUENCE¶
Если TOS является экземпляром
collections.abc.Sequenceи не является экземпляромstr/bytes/bytearray(или, более технически: если у него установлен флагPy_TPFLAGS_SEQUENCEв егоtp_flags), поместитьTrueв стек. В противном случае поместитьFalse.Новое в версии 3.10.
- MATCH_KEYS¶
TOS – это кортеж ключей отображения, а TOS1 – объект сопоставления. Если TOS1 содержит все ключи из TOS, поместить
tuple, содержащий соответствующие значения. В противном случае поместитьNone.Новое в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также помещала в стек логическое значение, указывающее на успех (
True) или неудачу (False).
- STORE_NAME(namei)¶
Реализует
name = TOS. namei – это индекс имени в атрибутеco_namesобъекта кода. Компилятор старается использоватьSTORE_FASTилиSTORE_GLOBAL, если возможно.
- DELETE_NAME(namei)¶
Реализует
del name, где namei – это индекс вco_namesатрибуте объекта кода.
- UNPACK_SEQUENCE(count)¶
Распаковывает TOS в count отдельных значений, которые помещаются в стек справа налево.
- UNPACK_EX(counts)¶
Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.
Младший байт counts – это количество значений до спискового значения, а старший байт counts – количество значений после него. Результирующие значения помещаются в стек справа налево.
- STORE_ATTR(namei)¶
Реализует
TOS.name = TOS1, где namei – это индекс имени вco_names.
- DELETE_ATTR(namei)¶
Реализует
del TOS.name, используя namei в качестве индекса вco_namesобъекта кода.
- STORE_GLOBAL(namei)¶
Работает как
STORE_NAME, но сохраняет имя как глобальное.
- DELETE_GLOBAL(namei)¶
Работает как
DELETE_NAME, но удаляет глобальное имя.
- LOAD_CONST(consti)¶
Помещает
co_consts[consti]в стек.
- LOAD_NAME(namei)¶
Помещает значение, связанное с
co_names[namei], в стек.
- BUILD_TUPLE(count)¶
Создаёт кортеж, потребляя count элементов из стека, и помещает полученный кортеж в стек.
- BUILD_LIST(count)¶
Работает как
BUILD_TUPLE, но создаёт список.
- BUILD_SET(count)¶
Работает как
BUILD_TUPLE, но создаёт множество.
- BUILD_MAP(count)¶
Помещает новый объект словаря в стек. Извлекает
2 * countэлементов так, чтобы словарь содержал count записей:{..., TOS3: TOS2, TOS1: TOS}.Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для count элементов.
- BUILD_CONST_KEY_MAP(count)¶
Версия
BUILD_MAP, оптимизированная для константных ключей. Снимает верхний элемент стека, содержащий кортеж ключей, затем, начиная сTOS1, снимает count значений и формирует словарь.Новое в версии 3.6.
- BUILD_STRING(count)¶
Конкатенирует count строк из стека и помещает результирующую строку в стек.
Новое в версии 3.6.
- LIST_TO_TUPLE¶
Извлекает список из стека и помещает кортеж, содержащий те же значения.
Новое в версии 3.9.
- LIST_EXTEND(i)¶
Вызывает
list.extend(TOS1[-i], TOS). Используется для построения списков.Новое в версии 3.9.
- SET_UPDATE(i)¶
Вызывает
set.update(TOS1[-i], TOS). Используется для создания множеств.Новое в версии 3.9.
- DICT_UPDATE(i)¶
Вызывает
dict.update(TOS1[-i], TOS). Используется для создания словарей.Новое в версии 3.9.
- DICT_MERGE(i)¶
Как
DICT_UPDATE, но вызывает исключение для повторяющихся ключей.Новое в версии 3.9.
- LOAD_ATTR(namei)¶
Заменяет TOS на
getattr(TOS, co_names[namei]).
- COMPARE_OP(opname)¶
Выполняет логическую операцию. Имя операции можно найти в
cmp_op[opname].
- IS_OP(invert)¶
Выполняет сравнение
isилиis not, еслиinvertравно 1.Новое в версии 3.9.
- CONTAINS_OP(invert)¶
Выполняет сравнение
inилиnot in, еслиinvertравно 1.Новое в версии 3.9.
- IMPORT_NAME(namei)¶
Импортирует модуль
co_names[namei]. TOS и TOS1 извлекаются и передаются в качестве аргументов fromlist и level для__import__(). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкцияSTORE_FASTизменяет пространство имён.
- IMPORT_FROM(namei)¶
Загружает атрибут
co_names[namei]из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкциейSTORE_FAST.
- JUMP_FORWARD(delta)¶
Увеличивает счётчик байт-кода на delta.
- JUMP_BACKWARD(delta)¶
Уменьшает счётчик байт-кода на delta. Проверяет прерывания.
Новое в версии 3.11.
- JUMP_BACKWARD_NO_INTERRUPT(delta)¶
Уменьшает счётчик байт-кода на delta. Не проверяет прерывания.
Новое в версии 3.11.
- POP_JUMP_FORWARD_IF_TRUE(delta)¶
Если TOS истинно, увеличивает счётчик байткода на delta. TOS извлекается.
Новое в версии 3.11.
- POP_JUMP_BACKWARD_IF_TRUE(delta)¶
Если TOS истинно, уменьшает счётчик байткода на delta. TOS извлекается.
Новое в версии 3.11.
- POP_JUMP_FORWARD_IF_FALSE(delta)¶
Если TOS ложно, увеличивает счётчик байткода на delta. TOS извлекается.
Новое в версии 3.11.
- POP_JUMP_BACKWARD_IF_FALSE(delta)¶
Если TOS ложно, уменьшает счётчик байткода на delta. TOS извлекается.
Новое в версии 3.11.
- POP_JUMP_FORWARD_IF_NOT_NONE(delta)¶
Если TOS не равно
None, увеличивает счётчик байткода на delta. TOS извлекается.Новое в версии 3.11.
- POP_JUMP_BACKWARD_IF_NOT_NONE(delta)¶
Если TOS не равно
None, уменьшает счётчик байткода на delta. TOS извлекается.Новое в версии 3.11.
- POP_JUMP_FORWARD_IF_NONE(delta)¶
Если TOS равно
None, увеличивает счётчик байткода на delta. TOS извлекается.Новое в версии 3.11.
- POP_JUMP_BACKWARD_IF_NONE(delta)¶
Если TOS равно
None, уменьшает счётчик байт-кода на delta. TOS удаляется из стека.Новое в версии 3.11.
- JUMP_IF_TRUE_OR_POP(delta)¶
Если TOS истинно, увеличивает счётчик байт-кода на delta и оставляет TOS на стеке. В противном случае (TOS ложно), TOS удаляется из стека.
Новое в версии 3.1.
Изменено в версии 3.11: Аргумент операции (oparg) теперь является относительным смещением, а не абсолютной целью.
- JUMP_IF_FALSE_OR_POP(delta)¶
Если TOS ложно, увеличивает счётчик байт-кода на delta и оставляет TOS на стеке. В противном случае (TOS истинно), TOS удаляется из стека.
Новое в версии 3.1.
Изменено в версии 3.11: Аргумент операции (oparg) теперь является относительным смещением, а не абсолютной целью.
- FOR_ITER(delta)¶
TOS является итератором. Вызвать его метод
__next__(). Если это даёт новое значение, поместить его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, TOS удаляется из стека, а счётчик байт-кода увеличивается на delta.
- LOAD_GLOBAL(namei)¶
Загружает глобальную переменную
co_names[namei>>1]в стек.Изменено в версии 3.11: Если младший бит
nameiустановлен, тоNULLпомещается в стек перед глобальной переменной.
- LOAD_FAST(var_num)¶
Помещает ссылку на локальную переменную
co_varnames[var_num]в стек.
- STORE_FAST(var_num)¶
Сохраняет TOS в локальную переменную
co_varnames[var_num].
- DELETE_FAST(var_num)¶
Удаляет локальную переменную
co_varnames[var_num].
- 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_CLASSDEREF(i)¶
Похожа на
LOAD_DEREF, но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.Новое в версии 3.4.
Изменено в версии 3.11:
iбольше не смещается на длинуco_varnames.
- STORE_DEREF(i)¶
Сохраняет TOS в ячейку, находящуюся в слоте
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 TOS(вызов экземпляра или типа исключения по адресуTOS)2:
raise TOS1 from TOS(возбуждает экземпляр или тип исключения наTOS1с__cause__установленным вTOS)
- CALL(argc)¶
Вызывает вызываемый объект с количеством аргументов, указанным
argc, включая именованные аргументы, указанные предшествующей инструкциейKW_NAMES, если таковые имеются. В стеке находятся (в порядке возрастания) либо:NULL
Вызываемый объект
Позиционные аргументы
Именованные аргументы
или:
Вызываемый объект
selfОставшиеся позиционные аргументы
Именованные аргументы
argc– это общее количество позиционных и именованных аргументов, за исключениемself, еслиNULLотсутствует.CALLизвлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом.Новое в версии 3.11.
- CALL_FUNCTION_EX(flags)¶
Вызывает вызываемый объект с набором позиционных и именованных аргументов переменной длины. Если установлен младший бит flags, на вершине стека находится отображающий объект (mapping), содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта отображающий объект и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно.
CALL_FUNCTION_EXизвлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.Новое в версии 3.6.
- LOAD_METHOD(namei)¶
Загружает метод с именем
co_names[namei]из объекта TOS. TOS удаляется из стека. Этот байт-код различает два случая: если TOS имеет метод с правильным именем, он помещает в стек несвязанный метод и TOS. TOS будет использоваться как первый аргумент (self) вCALLпри вызове несвязанного метода. В противном случае помещаютсяNULLи объект, возвращённый поиском атрибута.Добавлено в версии 3.7.
- PRECALL(argc)¶
Префикс к
CALL. Логически это пустая операция. Она существует для обеспечения эффективной специализации вызовов.argc– количество аргументов, как описано вCALL.Новое в версии 3.11.
- PUSH_NULL¶
Помещает
NULLв стек. Используется в последовательности вызова для сопоставления сNULL, помещённымLOAD_METHODдля вызовов не-методов.Новое в версии 3.11.
- KW_NAMES(i)¶
Является префиксом для
PRECALL. Сохраняет ссылку наco_consts[consti]во внутреннюю переменную для использованияCALL.co_consts[consti]должна быть кортежем строк.Новое в версии 3.11.
- MAKE_FUNCTION(flags)¶
Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанное значение флага.
0x01кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке0x02словарь значений по умолчанию только-именованных параметров0x04кортеж строк, содержащих аннотации параметров0x08кортеж, содержащий ячейки для свободных переменных, образующий замыканиекод, связанный с функцией (на TOS)
Изменено в версии 3.10: Значение флага
0x04теперь является кортежем строк вместо словаряИзменено в версии 3.11: Квалифицированное имя на TOS было удалено.
- BUILD_SLICE(argc)¶
Помещает объект среза в стек. argc должен быть 2 или 3. Если равно 2, помещается
slice(TOS1, TOS); если 3, помещаетсяslice(TOS2, TOS1, TOS). Подробнее см. встроенную функциюslice().
- EXTENDED_ARG(ext)¶
Является префиксом для любой операции, аргумент которой слишком велик, чтобы поместиться в один байт по умолчанию. ext содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждой операции допускается не более трёх префиксов
EXTENDED_ARG, формирующих аргумент от двух до четырёх байт.
- FORMAT_VALUE(flags)¶
Используется для реализации форматированных строковых литералов (f-строк). Извлекает из стека необязательную спецификацию формата, затем обязательное значение. Флаги интерпретируются следующим образом:
(flags & 0x03) == 0x00: значение форматируется как есть.(flags & 0x03) == 0x01: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.(flags & 0x03) == 0x02: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.(flags & 0x03) == 0x03: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.(flags & 0x04) == 0x04: извлечь fmt_spec из стека и использовать его, иначе использовать пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format(). Результат помещается в стек.Новое в версии 3.6.
- MATCH_CLASS(count)¶
TOS – это кортеж имен ключевых атрибутов, TOS1 – класс, с которым производится сопоставление, а TOS2 – объект сопоставления. count – количество позиционных подшаблонов.
Извлечь TOS, TOS1 и TOS2. Если TOS2 является экземпляром TOS1 и имеет позиционные и ключевые атрибуты, требуемые count и TOS, поместить кортеж извлеченных атрибутов. Иначе поместить
None.Новое в версии 3.10.
Изменено в версии 3.11: Ранее эта инструкция также помещала в стек логическое значение, указывающее на успех (
True) или неудачу (False).
- RESUME(where)¶
Пустая операция. Выполняет внутренние проверки трассировки, отладки и оптимизации.
Операнд
whereотмечает, где происходитRESUME:0Начало функции1После выраженияyield2После выраженияyield from3После выраженияawait
Новое в версии 3.11.
- RETURN_GENERATOR¶
Создает генератор, корутину или асинхронный генератор из текущего фрейма. Очищает текущий фрейм и возвращает вновь созданный генератор.
Новое в версии 3.11.
- SEND¶
Отправляет
Noneподгенератору этого генератора. Используется в операторахyield fromиawait.Новое в версии 3.11.
- ASYNC_GEN_WRAP¶
Оборачивает значение на вершине стека в
async_generator_wrapped_value. Используется для yield в асинхронных генераторах.Новое в версии 3.11.
- HAVE_ARGUMENT¶
Это не совсем опкод. Он обозначает границу между опкодами, которые не используют свой аргумент, и теми, которые используют (соответственно
< HAVE_ARGUMENTи>= HAVE_ARGUMENT).Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды
< HAVE_ARGUMENTигнорируют его. Раньше аргумент был только у опкодов>= HAVE_ARGUMENT.
Коллекции опкодов¶Opcode collections
Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:
- dis.opname¶
Последовательность имён операций, индексируемая с помощью байткода.
- dis.opmap¶
Словарь, сопоставляющий имена операций с байткодами.
- dis.cmp_op¶
Последовательность всех имён операций сравнения.
- dis.hasconst¶
Последовательность байткодов, обращающихся к константе.
- dis.hasfree¶
Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она не включает ссылки на глобальные или встроенные области видимости).
- dis.hasname¶
Последовательность байткодов, обращающихся к атрибуту по имени.
- dis.hasjrel¶
Последовательность байткодов, имеющих относительную цель перехода.
- dis.hasjabs¶
Последовательность байткодов, имеющих абсолютную цель перехода.
- dis.haslocal¶
Последовательность байткодов, обращающихся к локальной переменной.
- dis.hascompare¶
Последовательность байткодов логических операций.