Spec-Zone.ru › Python 3.6

dis — Разборчик байткода Python

Исходный код: Lib/dis.py

Модуль dis поддерживает анализ байткода CPython байткода путём его дизассемблирования. Байткод CPython, который принимает на вход этот модуль, определён в файле Include/opcode.h и используется компилятором и интерпретатором.

Примечание реализации CPython: Байткод является деталью реализации интерпретатора CPython. Нет гарантий, что байткод не будет добавлен, удалён или изменён между версиями Python. Использование этого модуля не должно рассматриваться как работающее на разных виртуальных машинах Python или версиях Python.

Изменено в версии 3.6: Используются 2 байта для каждой инструкции. Раньше количество байтов варьировалось в зависимости от инструкции.

Пример: у функции myfunc():

def myfunc(alist):
    return len(alist)

можно использовать следующую команду для отображения дизассемблирования myfunc():

>>> dis.dis(myfunc)
  2           0 LOAD_GLOBAL              0 (len)
              2 LOAD_FAST                0 (alist)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE

(«2» — номер строки).

32.12.1. Анализ байткода

Новое в версии 3.4.

API для анализа байткода позволяет упаковать части кода Python в объект Bytecode, который предоставляет лёгкий доступ к деталям скомпилированного кода.

class dis.Bytecode(x, *, first_line=None, current_offset=None)

Анализирует байткод, соответствующий функции, генератору, методу, строке исходного кода или объекту кода (возвращённому compile()).

Это удобная обертка вокруг многих функций, перечисленных ниже, в частности, get_instructions(), так как итерирование по экземпляру Bytecode приводит к операциям байткода как экземпляры Instruction.

Если first_line не None, то это указывает на номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если она есть) берётся непосредственно из объекта дизассемблированного кода.

Если current_offset не None, он относится к смещению инструкции в дизассемблированном коде. Установка этого значения означает, что dis() отобразит маркер «текущей инструкции» у указанного кода операции.

classmethod from_traceback(tb)

Создаёт экземпляр Bytecode из указанного трассировки, устанавливая current_offset в инструкцию, ответственную за исключение.

codeobj

Объект скомпилированного кода.

first_line

Первая строка исходного кода объекта (если доступна).

dis()

Возвращает отформатированный вид операций байткода (то же самое, что печатает dis.dis(), но возвращается как многострочная строка).

info()

Возвращает отформатированную многострочную строку со подробной информацией об объекте кода, как code_info().

Пример:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
RETURN_VALUE

32.12.2. Функции анализа

Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в требуемый вывод. Они могут быть полезны, если выполняется только одна операция, поэтому промежуточный аналитический объект не нужен:

dis.code_info(x)

Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для предоставленной функции, генератора, метода, строки исходного кода или объекта кода.

Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации, и они могут произвольно изменяться на разных виртуальных машинах Python или версиях Python.

Новое в версии 3.2.

dis.show_code(x, *, file=None)

Выводит подробную информацию об объекте кода для предоставленной функции, метода, строки исходного кода или объекта кода в file (или sys.stdout если file не указан).

Это удобный синтаксический сахар для print(code_info(x), file=file), предназначенный для интерактивного исследования в командной строке интерпретатора.

Новое в версии 3.2.

Изменено в версии 3.4: Добавлен параметр file.

dis.dis(x=None, *, file=None)

Дизассемблирует объект x. x может обозначать модуль, класс, метод, функцию, генератор, объект кода, строку исходного кода или последовательность байтов исходного байткода. Для модуля он дизассемблирует все функции. Для класса он дизассемблирует все методы (включая методы класса и статические методы). Для объекта кода или последовательности исходного байткода он печатает по одной строке на инструкцию байткода. Строки сначала компилируются в объекты кода с помощью встроенной функции compile() перед дизассемблированием. Если объект не указан, эта функция дизассемблирует последнюю трассировку.

Дизассемблирование записывается в текстовом виде в предоставленный параметр file, если он указан, и в sys.stdout в противном случае.

Изменено в версии 3.4: Добавлен параметр file.

dis.distb(tb=None, *, file=None)

Дизассемблирует функцию верхнего уровня трассировки, используя последнюю трассировку, если не было передано никакой. Инструкция, вызвавшая исключение, указана.

Дизассемблирование записывается в текстовом виде в предоставленный параметр file, если он указан, и в sys.stdout в противном случае.

Изменено в версии 3.4: Добавлен параметр file.

dis.disassemble(code, lasti=-1, *, file=None)
dis.disco(code, lasti=-1, *, file=None)

Дизассемблирует объект кода, указывая последнюю инструкцию, если lasti был предоставлен. Вывод разделён на следующие столбцы:

  1. номер строки, для первой инструкции каждой строки
  2. текущая инструкция, указанная как -->,
  3. метка инструкции, указанная >>,
  4. адрес инструкции,
  5. имя кода операции,
  6. параметры операции и
  7. интерпретация параметров в скобках.

Интерпретация параметров распознаёт имена локальных и глобальных переменных, значения констант, целевые метки перехода и операторы сравнения.

Дизассемблирование записывается в текстовом виде в предоставленный параметр file, если он указан, и в sys.stdout в противном случае.

Изменено в версии 3.4: Добавлен параметр file.

dis.get_instructions(x, *, first_line=None)

Возвращает итератор по инструкциям в предоставленной функции, методе, строке исходного кода или объекте кода.

Итератор генерирует ряд именованных кортежей Instruction, содержащих подробности каждой операции в предоставленном коде.

Если first_line не None, то это указывает на номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если она есть) берётся непосредственно из объекта дизассемблированного кода.

Новое в версии 3.4.

dis.findlinestarts(code)

Эта функция-генератор использует атрибуты co_firstlineno и co_lnotab объекта кода code для поиска смещений, являющихся началом строк в исходном коде. Они генерируются как пары (offset, lineno). См. Objects/lnotab_notes.txt для формата co_lnotab и способа его декодирования.

Изменено в версии 3.6: Номера строк могут быть убывающими. Раньше они всегда были возрастающими.

dis.findlabels(code)

Обнаруживает все смещения в объекте кода code, которые являются целевыми метками перехода, и возвращает список этих смещений.

dis.stack_effect(opcode[, oparg])

Вычисляет эффект стека для opcode с аргументом oparg.

Новое в версии 3.4.

32.12.3. Инструкции байткода Python

Функция get_instructions() и класс Bytecode предоставляют подробности инструкций байткода как экземпляры Instruction:

class dis.Instruction

Подробности для байт-кодовой операции

opcode

Числовой код операции, соответствующий значениям opcode, указанным ниже, и значениям байт-кода в Коллекциях opcode.

opname

Читаемое человеком имя операции

arg

Числовой аргумент операции (если есть), в противном случае None

argval

Разрешённое значение аргумента (если известно), в противном случае совпадает с arg

argrepr

Читаемое человеком описание аргумента операции

offset

Начальный индекс операции в последовательности байт-кода

starts_line

Строка, начинающаяся с данного opcode (если есть), в противном случае None

is_jump_target

True если другой код переходит сюда, в противном случае False

Введено в версии 3.4.

Компилятор Python в настоящее время генерирует следующие инструкции байт-кода.

Общие инструкции

NOP

Инструкция бездействия. Используется как заполнитель оптимизатором байт-кода.

POP_TOP

Удаляет элемент вершины стека (TOS).

ROT_TWO

Меняет местами два верхних элемента стека.

ROT_THREE

Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний элемент вниз на позицию три.

DUP_TOP

Дублирует ссылку, расположенную сверху стека.

Введено в версии 3.2.

DUP_TOP_TWO

Дублирует две ссылки, расположенные сверху стека, сохраняя их в том же порядке.

Введено в версии 3.2.

Унарные операции

Унарные операции берут верхний элемент стека, применяют к нему операцию и помещают результат обратно в стек.

UNARY_POSITIVE

Реализует TOS = +TOS.

UNARY_NEGATIVE

Реализует TOS = -TOS.

UNARY_NOT

Реализует TOS = not TOS.

UNARY_INVERT

Реализует TOS = ~TOS.

GET_ITER

Реализует TOS = iter(TOS).

GET_YIELD_FROM_ITER

Если TOS является объектом генератора-итератора или корутины, он остаётся неизменным. В противном случае, реализует TOS = iter(TOS).

Введено в версии 3.5.

Бинарные операции

Бинарные операции удаляют из стека верхний элемент (TOS) и второй сверху элемент стека (TOS1). Выполняют операцию и помещают результат обратно в стек.

BINARY_POWER

Реализует TOS = TOS1 ** TOS.

BINARY_MULTIPLY

Реализует TOS = TOS1 * TOS.

BINARY_MATRIX_MULTIPLY

Реализует TOS = TOS1 @ TOS.

Введено в версии 3.5.

BINARY_FLOOR_DIVIDE

Реализует TOS = TOS1 // TOS.

BINARY_TRUE_DIVIDE

Реализует TOS = TOS1 / TOS.

BINARY_MODULO

Реализует TOS = TOS1 % TOS.

BINARY_ADD

Реализует TOS = TOS1 + TOS.

BINARY_SUBTRACT

Реализует TOS = TOS1 - TOS.

BINARY_SUBSCR

Реализует TOS = TOS1[TOS].

BINARY_LSHIFT

Реализует TOS = TOS1 << TOS.

BINARY_RSHIFT

Реализует TOS = TOS1 >> TOS.

BINARY_AND

Реализует TOS = TOS1 & TOS.

BINARY_XOR

Реализует TOS = TOS1 ^ TOS.

BINARY_OR

Реализует TOS = TOS1 | TOS.

Операции на месте

Операции на месте похожи на бинарные операции, за исключением того, что они выполняют операцию на месте, когда это поддерживается TOS1, а результирующий TOS может быть (но не обязательно) исходным TOS1.

INPLACE_POWER

Реализует операцию на месте TOS = TOS1 ** TOS.

INPLACE_MULTIPLY

Реализует операцию на месте TOS = TOS1 * TOS.

INPLACE_MATRIX_MULTIPLY

Реализует операцию на месте TOS = TOS1 @ TOS.

Введено в версии 3.5.

INPLACE_FLOOR_DIVIDE

Реализует операцию на месте TOS = TOS1 // TOS.

INPLACE_TRUE_DIVIDE

Реализует операцию на месте TOS = TOS1 / TOS.

INPLACE_MODULO

Реализует операцию на месте TOS = TOS1 % TOS.

INPLACE_ADD

Реализует операцию на месте TOS = TOS1 + TOS.

INPLACE_SUBTRACT

Реализует операцию на месте TOS = TOS1 - TOS.

INPLACE_LSHIFT

Реализует операцию на месте TOS = TOS1 << TOS.

INPLACE_RSHIFT

Реализует операцию на месте TOS = TOS1 >> TOS.

INPLACE_AND

Реализует операцию на месте TOS = TOS1 & TOS.

INPLACE_XOR

Реализует операцию на месте TOS = TOS1 ^ TOS.

INPLACE_OR

Реализует операцию на месте TOS = TOS1 | TOS.

STORE_SUBSCR

Реализует TOS1[TOS] = TOS2.

DELETE_SUBSCR

Реализует del TOS1[TOS].

Инструкции корутины

GET_AWAITABLE

Реализует TOS = get_awaitable(TOS), где get_awaitable(o) возвращает o если o является объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешает o.__await__.

Введено в версии 3.5.

GET_AITER

Реализует TOS = get_awaitable(TOS.__aiter__()). Смотрите GET_AWAITABLE для деталей о get_awaitable

Введено в версии 3.5.

GET_ANEXT

Реализует PUSH(get_awaitable(TOS.__anext__())). Смотрите GET_AWAITABLE для деталей о get_awaitable

Введено в версии 3.5.

BEFORE_ASYNC_WITH

Разрешает __aenter__ и __aexit__ из объекта на вершине стека. Помещает __aexit__ и результат __aenter__() в стек.

Введено в версии 3.5.

SETUP_ASYNC_WITH

Создаёт новый объект фрейма.

Введено в версии 3.5.

Разные opcode

PRINT_EXPR

Реализует оператор выражения для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме оператор выражения завершается инструкцией POP_TOP.

BREAK_LOOP

Прерывает цикл из-за инструкции break.

CONTINUE_LOOP(target)

Продолжает цикл из-за инструкции continue. target — адрес перехода (который должен быть инструкцией FOR_ITER).

SET_ADD(i)

Вызывает set.add(TOS1[-i], TOS). Используется для реализации множественных генераторов.

LIST_APPEND(i)

Вызывает list.append(TOS[-i], TOS). Используется для реализации генераторов списков.

MAP_ADD(i)

Вызывает dict.setitem(TOS1[-i], TOS, TOS1). Используется для реализации генераторов словарей.

Добавлена в версии 3.1.

Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, при добавлении значения или пары ключ/значение, объект контейнера остаётся на стеке, чтобы он был доступен для дальнейших итераций цикла.

RETURN_VALUE

Возвращает значение TOS вызывающей функции.

YIELD_VALUE

Извлекает TOS и возвращает его из генератора.

YIELD_FROM

Извлекает TOS и делегирует ему как под-итератору из генератора.

Добавлена в версии 3.3.

SETUP_ANNOTATIONS

Проверяет, определён ли __annotations__ в locals(). Если нет, он инициализируется пустым dict. Эта инструкция генерируется только в том случае, если тело класса или модуля содержит аннотации переменных статически.

Добавлена в версии 3.6.

IMPORT_STAR

Загружает все символы, не начинающиеся с '_' непосредственно из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Эта инструкция реализует from module import *.

POP_BLOCK

Удаляет один блок из стека блоков. В каждом кадре есть стек блоков, обозначающих вложенные циклы, операторы try и т.п.

POP_EXCEPT

Удаляет один блок из стека блоков. Удаляемый блок должен быть блоком обработки исключений, неявно создаваемым при входе в обработчик исключений. Помимо извлечения лишних значений из стека фрейма, последние три извлечённые значения используются для восстановления состояния исключения.

END_FINALLY

Завершает блок finally. Интерпретатор вспоминает, должно ли исключение быть повторно поднято или функция возвращается, и продолжает с внешним блоком.

LOAD_BUILD_CLASS

Помещает builtins.__build_class__() на стек. Позже оно вызывается инструкцией CALL_FUNCTION для построения класса.

SETUP_WITH(delta)

Эта инструкция выполняет несколько операций перед началом блока with. Во-первых, она загружает __exit__() из менеджера контекста и помещает его на стек для последующего использования инструкцией WITH_CLEANUP. Затем вызывается __enter__(), и на стек помещается блок finally, указывающий на delta. Наконец, результат вызова метода enter помещается на стек. Следующая инструкция либо проигнорирует его (POP_TOP), либо сохранит его в (одной или нескольких) переменных (STORE_FAST, STORE_NAME или UNPACK_SEQUENCE).

Добавлена в версии 3.2.

WITH_CLEANUP_START

Очищает стек при выходе из блока оператора with. TOS — метод __exit__() менеджера контекста. Под TOS находятся 1–3 значения, указывающие, как/почему был вызван блок finally:

  • SECOND = None
  • (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
  • SECOND = WHY_*; без retval ниже
  • (SECOND, THIRD, FOURTH) = exc_info()

В последнем случае вызывается TOS(SECOND, THIRD, FOURTH), в противном случае TOS(None, None, None). На стек помещаются SECOND и результат вызова.

WITH_CLEANUP_FINISH

Извлекает тип исключения и результат вызова функции «exit» со стека.

Если стек представляет исключение, и функция возвращает «истинное» значение, эта информация «удаляется» и заменяется одиночным WHY_SILENCED, чтобы предотвратить повторное поднятие исключения инструкцией END_FINALLY. (Однако нелокальные переходы всё ещё будут возобновлены.)

Все следующие инструкции используют свои аргументы.

STORE_NAME(namei)

Реализует name = TOS. namei — индекс name в атрибуте co_names объекта кода. Компилятор пытается использовать STORE_FAST или STORE_GLOBAL, если это возможно.

DELETE_NAME(namei)

Реализует del name, где namei — индекс в атрибуте co_names объекта кода.

UNPACK_SEQUENCE(count)

Распаковывает TOS в отдельные count значений, которые помещаются на стек справа налево.

UNPACK_EX(counts)

Реализует присвоение со звёздочкой: распаковывает итерируемый объект TOS в отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.

Низкий байт counts — количество значений перед значением списка, высокий байт counts — количество значений после него. Результирующие значения помещаются на стек справа налево.

STORE_ATTR(namei)

Реализует TOS.name = TOS1, где namei — индекс имени в co_names.

DELETE_ATTR(namei)

Реализует del TOS.name, используя namei как индекс в co_names.

STORE_GLOBAL(namei)

Действует как STORE_NAME, но сохраняет имя как глобальное.

DELETE_GLOBAL(namei)

Действует как DELETE_NAME, но удаляет глобальное имя.

LOAD_CONST(consti)

Помещает co_consts[consti] на стек.

LOAD_NAME(namei)

Помещает на стек значение, ассоциированное с co_names[namei].

BUILD_TUPLE(count)

Создаёт кортеж, потребляя count элементов со стека и помещает получившийся кортеж на стек.

BUILD_LIST(count)

Действует как BUILD_TUPLE, но создаёт список.

BUILD_SET(count)

Действует как BUILD_TUPLE, но создаёт множество.

BUILD_MAP(count)

Помещает на стек новый объект словаря. Извлекает 2 * count элемента с целью того, чтобы словарь содержал count записей: {..., TOS3: TOS2, TOS1: TOS}.

Изменено в версии 3.5: Словарь создаётся из элементов стека, вместо создания пустого словаря предварительно размером, способным вместить count элементов.

BUILD_CONST_KEY_MAP(count)

Версия BUILD_MAP, специализированная для постоянных ключей. Из стека извлекаются count значений. Верхний элемент стека содержит кортеж ключей.

Новая в версии 3.6.

BUILD_STRING(count)

Конкатенирует count строк из стека и помещает результирующую строку в стек.

Новая в версии 3.6.

BUILD_TUPLE_UNPACK(count)

Извлекает из стека count итерируемых объектов, объединяет их в один кортеж и помещает результат в стек. Реализует распаковку итерируемых объектов в отображения кортежей (*x, *y, *z).

Новая в версии 3.5.

BUILD_TUPLE_UNPACK_WITH_CALL(count)

Аналогично BUILD_TUPLE_UNPACK, но используется для синтаксиса вызова f(*x, *y, *z). Элемент стека в позиции count + 1 должен быть соответствующей вызываемой функцией f.

Новая в версии 3.6.

BUILD_LIST_UNPACK(count)

Аналогично BUILD_TUPLE_UNPACK, но помещает в стек список вместо кортежа. Реализует распаковку итерируемых объектов в списки [*x, *y, *z].

Новая в версии 3.5.

BUILD_SET_UNPACK(count)

Аналогично BUILD_TUPLE_UNPACK, но помещает в стек множество вместо кортежа. Реализует распаковку итерируемых объектов в множества {*x, *y, *z}.

Новая в версии 3.5.

BUILD_MAP_UNPACK(count)

Извлекает из стека count словарей, объединяет их в один словарь и помещает результат в стек. Реализует распаковку словарей в отображения словарей {**x, **y, **z}.

Новая в версии 3.5.

BUILD_MAP_UNPACK_WITH_CALL(count)

Аналогично BUILD_MAP_UNPACK, но используется для синтаксиса вызова f(**x, **y, **z). Элемент стека в позиции count + 2 должен быть соответствующей вызываемой функцией f.

Новая в версии 3.5.

Изменено в версии 3.6: Позиция вызываемой функции определяется путем добавления 2 к аргументу операции, а не кодируется во втором байте аргумента.

LOAD_ATTR(namei)

Заменяет TOS на getattr(TOS, co_names[namei]).

COMPARE_OP(opname)

Выполняет булеву операцию. Название операции можно найти в cmp_op[opname].

IMPORT_NAME(namei)

Импортирует модуль co_names[namei]. Из стека извлекаются TOS и TOS1, которые представляют аргументы fromlist и level функции __import__(). Объект модуля помещается в стек. Текущее пространство имен не затрагивается: для правильной инструкции импорта последующая инструкция STORE_FAST изменяет пространство имен.

IMPORT_FROM(namei)

Загружает атрибут co_names[namei] из модуля в TOS. Результирующий объект помещается в стек, чтобы быть сохранённым последующей инструкцией STORE_FAST.

JUMP_FORWARD(delta)

Увеличивает счётчик байткода на delta.

POP_JUMP_IF_TRUE(target)

Если TOS истинно, устанавливает счётчик байткода на target. TOS удаляется из стека.

Новая в версии 3.1.

POP_JUMP_IF_FALSE(target)

Если TOS ложно, устанавливает счётчик байткода на target. TOS удаляется из стека.

Новая в версии 3.1.

JUMP_IF_TRUE_OR_POP(target)

Если TOS истинно, устанавливает счётчик байткода на target и оставляет TOS в стеке. Иначе (TOS ложно), TOS удаляется из стека.

Новая в версии 3.1.

JUMP_IF_FALSE_OR_POP(target)

Если TOS ложно, устанавливает счётчик байткода на target и оставляет TOS в стеке. Иначе (TOS истинно), TOS удаляется из стека.

Новая в версии 3.1.

JUMP_ABSOLUTE(target)

Устанавливает счётчик байткода на target.

FOR_ITER(delta)

TOS — итератор. Вызывается его метод __next__(). Если это приводит к новому значению, оно помещается в стек (итератор остаётся ниже). Если итератор указывает на исчерпание, TOS удаляется, и счётчик байткода увеличивается на delta.

LOAD_GLOBAL(namei)

Загружает глобальную переменную с именем co_names[namei] в стек.

SETUP_LOOP(delta)

Помещает блок цикла в стек блоков. Блок охватывает текущую инструкцию размером delta байт.

SETUP_EXCEPT(delta)

Помещает блок обработки исключений из оператора try-except в стек блоков. delta указывает на первый блок except.

SETUP_FINALLY(delta)

Помещает блок обработки исключений из оператора try-except в стек блоков. delta указывает на блок finally.

LOAD_FAST(var_num)

Помещает ссылку на локальную переменную co_varnames[var_num] в стек.

STORE_FAST(var_num)

Сохраняет TOS в локальную переменную co_varnames[var_num].

DELETE_FAST(var_num)

Удаляет локальную переменную co_varnames[var_num].

STORE_ANNOTATION(namei)

Сохраняет TOS как locals()['__annotations__'][co_names[namei]] = TOS.

Новая в версии 3.6.

LOAD_CLOSURE(i)

Помещает ссылку на ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Имя переменной — co_cellvars[i] если i меньше длины co_cellvars. Иначе — co_freevars[i - len(co_cellvars)].

LOAD_DEREF(i)

Загружает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Помещает в стек ссылку на объект, содержащийся в ячейке.

LOAD_CLASSDEREF(i)

Почти как LOAD_DEREF, но сначала проверяет словарь локальных переменных перед обращением к ячейке. Используется для загрузки свободных переменных в телах классов.

Новая в версии 3.4.

STORE_DEREF(i)

Сохраняет TOS в ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных.

DELETE_DEREF(i)

Очищает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Используется оператором del.

Новая в версии 3.2.

RAISE_VARARGS(argc)

Вызывает исключение. argc указывает на количество аргументов оператора raise, от 0 до 3. Обработчик найдёт трассировку стека как TOS2, параметр как TOS1, и само исключение как TOS.

CALL_FUNCTION(argc)

Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов. Верх стека содержит позиционные аргументы, с правым аргументом сверху. Под аргументами находится вызываемый объект. CALL_FUNCTION извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта в стек.

Изменено в версии 3.6: Этот оператор используется только для вызовов с позиционными аргументами.

CALL_FUNCTION_KW(argc)

Вызывает вызываемый объект с позиционными (если есть) и именованными аргументами. argc указывает общее количество позиционных и именованных аргументов. Верхний элемент стека содержит кортеж имён именованных аргументов. Ниже него расположены именованные аргументы в порядке, соответствующем кортежу. Ниже них расположены позиционные аргументы, причём самый правый параметр находится сверху. Под аргументами находится вызываемый объект. CALL_FUNCTION_KW извлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта на стек.

Изменено в версии 3.6: Именованные аргументы упаковываются в кортеж вместо словаря, argc указывает общее количество аргументов.

CALL_FUNCTION_EX(flags)

Вызывает вызываемый объект с набором позиционных и именованных аргументов. Если младший бит flags установлен, в верхней части стека находится объект отображения, содержащий дополнительные именованные аргументы. Под ним находится итерируемый объект, содержащий позиционные аргументы, и вызываемый объект. BUILD_MAP_UNPACK_WITH_CALL и BUILD_TUPLE_UNPACK_WITH_CALL могут использоваться для объединения нескольких объектов отображения и итерируемых объектов, содержащих аргументы. Перед вызовом вызываемого объекта объекты отображения и итерируемые объекты распаковываются, и их содержимое передаётся соответственно в качестве именованных и позиционных аргументов. CALL_FUNCTION_EX извлекает все аргументы и вызываемый объект со стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение вызываемого объекта на стек.

Добавлена в версии 3.6.

MAKE_FUNCTION(argc)

Помещает на стек новый объект функции. Снизу вверх, потребляемый стек должен состоять из значений, если аргумент несёт указанное значение флага.

  • 0x01 кортеж значений по умолчанию для позиционных-только и позиционных-или-именованных параметров в позиционном порядке
  • 0x02 словарь значений по умолчанию для именованных-только параметров
  • 0x04 словарь аннотаций
  • 0x08 кортеж, содержащий ячейки для свободных переменных, формируя замыкание
  • код, связанный с функцией (в TOS1)
  • полное имя функции (в TOS)
BUILD_SLICE(argc)

Помещает на стек объект среза. argc должен быть 2 или 3. Если это 2, slice(TOS1, TOS) помещается на стек; если это 3, slice(TOS2, TOS1, TOS) помещается на стек. Смотрите встроенную функцию slice() для получения дополнительной информации.

EXTENDED_ARG(ext)

Представляет собой префикс любого кода операции, у которого аргумент слишком большой для размещения в стандартные два байта. ext содержит два дополнительных байта, которые вместе с аргументом последующей операции образуют четырёхбайтный аргумент, ext представляя собой два старших байта.

FORMAT_VALUE(flags)

Используется для реализации форматированных строковых литералов (f-строк). Извлекает необязательный fmt_spec со стека, а затем обязательный value. flags интерпретируется следующим образом:

  • (flags & 0x03) == 0x00: value форматируется как есть.
  • (flags & 0x03) == 0x01: вызывается str() для value перед его форматированием.
  • (flags & 0x03) == 0x02: вызывается repr() для value перед его форматированием.
  • (flags & 0x03) == 0x03: вызывается ascii() для value перед его форматированием.
  • (flags & 0x04) == 0x04: извлекается fmt_spec со стека и используется, иначе используется пустой fmt_spec.

Форматирование выполняется с помощью PyObject_Format(). Результат помещается на стек.

Добавлена в версии 3.6.

HAVE_ARGUMENT

Это не совсем операция. Она определяет разделительную линию между операциями, не использующими свой аргумент, и теми, которые используют (соответственно, < HAVE_ARGUMENT и >= HAVE_ARGUMENT).

Изменено в версии 3.6: Теперь у каждой инструкции есть аргумент, но операции < HAVE_ARGUMENT игнорируют его. Раньше только операции >= HAVE_ARGUMENT имели аргумент.

32.12.4. Сборники кодов операций

Эти наборы предоставляются для автоматического интроспекции инструкций байткода:

dis.opname

Последовательность имён операций, индексируемая с использованием байткода.

dis.opmap

Словарь, сопоставляющий имена операций с кодами операций.

dis.cmp_op

Последовательность всех имён операций сравнения.

dis.hasconst

Последовательность кодов операций, которые обращаются к константе.

dis.hasfree

Последовательность кодов операций, которые обращаются к свободной переменной (обратите внимание, что «свободная» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или именам во внешних областях видимости, на которые ссылаются из этой области видимости. Она не включает ссылки на глобальные или встроенные области видимости).

dis.hasname

Последовательность кодов операций, которые обращаются к атрибуту по имени.

dis.hasjrel

Последовательность кодов операций, которые имеют относительную цель перехода.

dis.hasjabs

Последовательность кодов операций, которые имеют абсолютную цель перехода.

dis.haslocal

Последовательность кодов операций, которые обращаются к локальной переменной.

dis.hascompare

Последовательность кодов операций булевых операций.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/dis.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API