Документация Python неофициальный перевод

dis.md

618 строк · 34.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 32.12. [`dis`](https://python-all.ru/2.7/library/dis.html#module-dis) – Дизассемблер байт-кода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/2.7/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/2.7/library/dis.html#module-dis) поддерживает анализ [байт-кода](https://python-all.ru/2.7/glossary.html#term-bytecode) CPython путём eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход, определён в файле `Include/opcode.h` и используется компилятором и интерпретатором.1415**Особенность реализации CPython:** Байт-код – деталь реализации интерпретатора CPython! Не гарантируется, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что этот модуль будет работать в других виртуальных машинах Python или в других выпусках Python.1617Пример: Дана функция `myfunc()`:1819```python20def myfunc(alist):21    return len(alist)22```2324следующая команда позволяет получить дизассемблированный код `myfunc()`:2526```python27>>> dis.dis(myfunc)28  2           0 LOAD_GLOBAL              0 (len)29              3 LOAD_FAST                0 (alist)30              6 CALL_FUNCTION            131              9 RETURN_VALUE32```3334(«2» – это номер строки).3536Модуль [`dis`](https://python-all.ru/2.7/library/dis.html#module-dis) определяет следующие функции и константы:3738#### `dis.dis([bytesource])`3940Дизассемблирует объект *bytesource*. *bytesource* может обозначать модуль, класс, метод, функцию или объект кода. Для модуля дизассемблируются все функции. Для класса – все методы. Для отдельной последовательности кода выводится одна строка на каждую инструкцию байткода. Если объект не указан, дизассемблируется последний traceback.4142#### `dis.distb([tb])`4344Дизассемблирует функцию на вершине стека traceback, используя последний traceback, если ни один не был передан. Инструкция, вызвавшая исключение, отмечается.4546#### `dis.disassemble(code[, lasti])`4748Дизассемблирует объект кода, указывая последнюю инструкцию, если был указан *lasti*. Вывод разделён на следующие столбцы:49501. номер строки для первой инструкции каждой строки512. текущая инструкция, помечена как `-->`,523. инструкция с меткой, помечена `>>`,534. адрес инструкции,545. название кода операции,556. параметры операции и567. интерпретация параметров в скобках.5758Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.5960#### `dis.disco(code[, lasti])`6162Синоним для [`disassemble()`](https://python-all.ru/2.7/library/dis.html#dis.disassemble). Его удобнее набирать, и он сохранён для совместимости с более ранними версиями Python.6364#### `dis.findlinestarts(code)`6566Эта функция-генератор использует атрибуты `co_firstlineno` и `co_lnotab` объекта кода *code* для поиска смещений, соответствующих началам строк в исходном коде. Они возвращаются в виде пар `(offset, lineno)`.6768#### `dis.findlabels(code)`6970Определяет все смещения в объекте кода *code*, которые являются целями перехода, и\\nвозвращает список этих смещений.7172#### `dis.opname`7374Последовательность имён операций, индексируемая с помощью байткода.7576#### `dis.opmap`7778Словарь, сопоставляющий имена операций с байткодами.7980#### `dis.cmp_op`8182Последовательность всех имён операций сравнения.8384#### `dis.hasconst`8586Последовательность байткодов, обращающихся к константе.8788#### `dis.hasfree`8990Последовательность байткодов, обращающихся к свободной переменной.9192#### `dis.hasname`9394Последовательность байткодов, обращающихся к атрибуту по имени.9596#### `dis.hasjrel`9798Последовательность байткодов, имеющих относительную цель перехода.99100#### `dis.hasjabs`101102Последовательность байткодов, имеющих абсолютную цель перехода.103104#### `dis.haslocal`105106Последовательность байткодов, обращающихся к локальной переменной.107108#### `dis.hascompare`109110Последовательность байткодов логических операций.111112## 32.12.1. Инструкции байт-кода Python113114В настоящее время компилятор Python генерирует следующие инструкции байткода.115116**`STOP_CODE`()**117118Указывает компилятору на конец кода, не используется интерпретатором.119120**`NOP`()**121122Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.123124**`POP_TOP`()**125126Удаляет элемент с вершины стека (TOS).127128**`ROT_TWO`()**129130Меняет местами два верхних элемента стека.131132**`ROT_THREE`()**133134Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.135136**`ROT_FOUR`()**137138Поднимает второй, третий и четвёртый элементы стека на одну позицию вверх, перемещает верхний элемент вниз на четвёртую позицию.139140**`DUP_TOP`()**141142Дублирует ссылку на вершине стека.143144Унарные операции берут верхушку стека, применяют операцию и помещают результат обратно в стек.145146**`UNARY_POSITIVE`()**147148Реализует `TOS = +TOS`.149150**`UNARY_NEGATIVE`()**151152Реализует `TOS = -TOS`.153154**`UNARY_NOT`()**155156Реализует `TOS = not TOS`.157158**`UNARY_CONVERT`()**159160Реализует `` TOS = `TOS` ``.161162**`UNARY_INVERT`()**163164Реализует `TOS = ~TOS`.165166**`GET_ITER`()**167168Реализует `TOS = iter(TOS)`.169170Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.171172**`BINARY_POWER`()**173174Реализует `TOS = TOS1 ** TOS`.175176**`BINARY_MULTIPLY`()**177178Реализует `TOS = TOS1 * TOS`.179180**`BINARY_DIVIDE`()**181182Реализует `TOS = TOS1 / TOS`, когда `from __future__ import division` не действует.183184**`BINARY_FLOOR_DIVIDE`()**185186Реализует `TOS = TOS1 // TOS`.187188**`BINARY_TRUE_DIVIDE`()**189190Реализует `TOS = TOS1 / TOS`, когда `from __future__ import division` действует.191192**`BINARY_MODULO`()**193194Реализует `TOS = TOS1 % TOS`.195196**`BINARY_ADD`()**197198Реализует `TOS = TOS1 + TOS`.199200**`BINARY_SUBTRACT`()**201202Реализует `TOS = TOS1 - TOS`.203204**`BINARY_SUBSCR`()**205206Реализует `TOS = TOS1[TOS]`.207208**`BINARY_LSHIFT`()**209210Реализует `TOS = TOS1 << TOS`.211212**`BINARY_RSHIFT`()**213214Реализует `TOS = TOS1 >> TOS`.215216**`BINARY_AND`()**217218Реализует `TOS = TOS1 & TOS`.219220**`BINARY_XOR`()**221222Реализует `TOS = TOS1 ^ TOS`.223224**`BINARY_OR`()**225226Реализует `TOS = TOS1 | TOS`.227228Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.229230**`INPLACE_POWER`()**231232Реализует операцию на месте `TOS = TOS1 ** TOS`.233234**`INPLACE_MULTIPLY`()**235236Реализует операцию на месте `TOS = TOS1 * TOS`.237238**`INPLACE_DIVIDE`()**239240Реализует `TOS = TOS1 / TOS` на месте, когда `from __future__ import division` не действует.241242**`INPLACE_FLOOR_DIVIDE`()**243244Реализует операцию на месте `TOS = TOS1 // TOS`.245246**`INPLACE_TRUE_DIVIDE`()**247248Реализует `TOS = TOS1 / TOS` на месте, когда `from __future__ import division` действует.249250**`INPLACE_MODULO`()**251252Реализует операцию на месте `TOS = TOS1 % TOS`.253254**`INPLACE_ADD`()**255256Реализует операцию на месте `TOS = TOS1 + TOS`.257258**`INPLACE_SUBTRACT`()**259260Реализует операцию на месте `TOS = TOS1 - TOS`.261262**`INPLACE_LSHIFT`()**263264Реализует операцию на месте `TOS = TOS1 << TOS`.265266**`INPLACE_RSHIFT`()**267268Реализует операцию на месте `TOS = TOS1 >> TOS`.269270**`INPLACE_AND`()**271272Реализует операцию на месте `TOS = TOS1 & TOS`.273274**`INPLACE_XOR`()**275276Реализует операцию на месте `TOS = TOS1 ^ TOS`.277278**`INPLACE_OR`()**279280Реализует операцию на месте `TOS = TOS1 | TOS`.281282Опкоды среза принимают до трёх параметров.283284**`SLICE+0`()**285286Реализует `TOS = TOS[:]`.287288**`SLICE+1`()**289290Реализует `TOS = TOS1[TOS:]`.291292**`SLICE+2`()**293294Реализует `TOS = TOS1[:TOS]`.295296**`SLICE+3`()**297298Реализует `TOS = TOS2[TOS1:TOS]`.299300Присваивание среза требует ещё один дополнительный параметр. Как и любая инструкция, они ничего не помещают в стек.301302**`STORE_SLICE+0`()**303304Реализует `TOS[:] = TOS1`.305306**`STORE_SLICE+1`()**307308Реализует `TOS1[TOS:] = TOS2`.309310**`STORE_SLICE+2`()**311312Реализует `TOS1[:TOS] = TOS2`.313314**`STORE_SLICE+3`()**315316Реализует `TOS2[TOS1:TOS] = TOS3`.317318**`DELETE_SLICE+0`()**319320Реализует `del TOS[:]`.321322**`DELETE_SLICE+1`()**323324Реализует `del TOS1[TOS:]`.325326**`DELETE_SLICE+2`()**327328Реализует `del TOS1[:TOS]`.329330**`DELETE_SLICE+3`()**331332Реализует `del TOS2[TOS1:TOS]`.333334**`STORE_SUBSCR`()**335336Реализует `TOS1[TOS] = TOS2`.337338**`DELETE_SUBSCR`()**339340Реализует `del TOS1[TOS]`.341342Разные опкоды.343344**`PRINT_EXPR`()**345346Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью [`POP_TOP`](https://python-all.ru/2.7/library/dis.html#opcode-POP_TOP).347348**`PRINT_ITEM`()**349350Выводит TOS в файлоподобный объект, связанный с `sys.stdout`. Есть одна такая инструкция для каждого элемента в операторе [`print`](https://python-all.ru/2.7/reference/simple_stmts.html#print).351352**`PRINT_ITEM_TO`()**353354Как `PRINT_ITEM`, но выводит элемент, второй от TOS, в файлоподобный объект на TOS. Это используется расширенным оператором print.355356**`PRINT_NEWLINE`()**357358Выводит новую строку на `sys.stdout`. Это генерируется как последняя операция оператора [`print`](https://python-all.ru/2.7/reference/simple_stmts.html#print), если только оператор не заканчивается запятой.359360**`PRINT_NEWLINE_TO`()**361362Как `PRINT_NEWLINE`, но выводит новую строку в файлоподобный объект на TOS. Это используется расширенным оператором print.363364**`BREAK_LOOP`()**365366Завершает цикл при выполнении оператора [`break`](https://python-all.ru/2.7/reference/simple_stmts.html#break).367368**`CONTINUE_LOOP`(*target*)**369370Продолжает цикл при выполнении оператора [`continue`](https://python-all.ru/2.7/reference/simple_stmts.html#continue). *target* – это адрес, на который нужно перейти (должен быть инструкция [`FOR_ITER`](https://python-all.ru/2.7/library/dis.html#opcode-FOR_ITER)).371372**`LIST_APPEND`(*i*)**373374Вызывает `list.append(TOS[-i], TOS)`. Используется для реализации списковых включений. Хотя добавленное значение извлекается из стека, объект списка остаётся в стеке, чтобы быть доступным для последующих итераций цикла.375376**`LOAD_LOCALS`()**377378Помещает ссылку на локальные переменные текущей области видимости в стек. Это используется в коде для определения класса: после вычисления тела класса локальные переменные передаются определению класса.379380**`RETURN_VALUE`()**381382Возвращает TOS вызывающей стороне функции.383384**`YIELD_VALUE`()**385386Извлекает `TOS` из стека и выдаёт его из [генератор](https://python-all.ru/2.7/glossary.html#term-generator).387388**`IMPORT_STAR`()**389390Загружает все имена, не начинающиеся с `'_'`, из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализует `from module import *`.391392**`EXEC_STMT`()**393394Реализует `exec TOS2,TOS1,TOS`. Компилятор заполняет отсутствующие необязательные параметры значением `None`.395396**`POP_BLOCK`()**397398Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, представляющий вложенные циклы, операторы try и т.п.399400**`END_FINALLY`()**401402Завершает предложение [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally). Интерпретатор запоминает, нужно ли повторно возбуждать исключение или функция возвращает значение, и продолжает со следующим внешним блоком.403404**`BUILD_CLASS`()**405406Создаёт новый объект класса. TOS – словарь методов, TOS1 – кортеж имён базовых классов, а TOS2 – имя класса.407408**`SETUP_WITH`(*delta*)**409410Эта инструкция выполняет несколько операций перед началом блока with. Во-первых, она загружает [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) из менеджера контекста и помещает его в стек для последующего использования [`WITH_CLEANUP`](https://python-all.ru/2.7/library/dis.html#opcode-WITH_CLEANUP). Затем вызывается [`__enter__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__enter__), и в стек помещается блок finally, указывающий на *delta*. Наконец, результат вызова метода enter помещается в стек. Следующая инструкция либо игнорирует его ([`POP_TOP`](https://python-all.ru/2.7/library/dis.html#opcode-POP_TOP)), либо сохраняет в переменную(ые) ([`STORE_FAST`](https://python-all.ru/2.7/library/dis.html#opcode-STORE_FAST), [`STORE_NAME`](https://python-all.ru/2.7/library/dis.html#opcode-STORE_NAME) или [`UNPACK_SEQUENCE`](https://python-all.ru/2.7/library/dis.html#opcode-UNPACK_SEQUENCE)).411412**`WITH_CLEANUP`()**413414Очищает стек при выходе из блока оператора [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with). На вершине стека находятся 1–3 значения, указывающие, как/почему был выполнен блок finally:415416- TOP = `None`417- (TOP, SECOND) = (`WHY_{RETURN,CONTINUE}`), retval418- TOP = `WHY_*`; retval под ним отсутствует419- (TOP, SECOND, THIRD) = exc\_info()420421Под ними находится EXIT, привязанный метод [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) менеджера контекста.422423В последнем случае вызывается `EXIT(TOP, SECOND, THIRD)`, иначе `EXIT(None, None, None)`.424425ВЫХОД удаляется из стека, оставляя значения над ним в том же порядке. Кроме того, если стек представляет исключение, *и* вызов функции возвращает «истинное» значение, эта информация «стирается», чтобы предотвратить повторное возбуждение исключения через `END_FINALLY`. (Но нелокальные переходы всё же следует возобновлять.)426427Все следующие опкоды требуют аргументов. Аргумент занимает два байта, причём старший байт идёт последним.428429**`STORE_NAME`(*namei*)**430431Реализует `name = TOS`. *namei* – это индекс *name* в атрибуте `co_names` объекта кода. Компилятор пытается использовать `STORE_FAST` или `STORE_GLOBAL`, если возможно.432433**`DELETE_NAME`(*namei*)**434435Реализует `del name`, где *namei* – это индекс в атрибут `co_names` объекта кода.436437**`UNPACK_SEQUENCE`(*count*)**438439Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.440441**`DUP_TOPX`(*count*)**442443Дублирует *count* элементов, сохраняя их порядок. Из-за ограничений реализации *count* должен быть от 1 до 5 включительно.444445**`STORE_ATTR`(*namei*)**446447Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.448449**`DELETE_ATTR`(*namei*)**450451Реализует `del TOS.name`, используя *namei* как индекс в `co_names`.452453**`STORE_GLOBAL`(*namei*)**454455Работает как `STORE_NAME`, но сохраняет имя как глобальное.456457**`DELETE_GLOBAL`(*namei*)**458459Работает как `DELETE_NAME`, но удаляет глобальное имя.460461**`LOAD_CONST`(*consti*)**462463Помещает `co_consts[consti]` в стек.464465**`LOAD_NAME`(*namei*)**466467Помещает значение, связанное с `co_names[namei]`, в стек.468469**`BUILD_TUPLE`(*count*)**470471Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек.472473**`BUILD_LIST`(*count*)**474475Работает как `BUILD_TUPLE`, но создаёт список.476477**`BUILD_SET`(*count*)**478479Работает как `BUILD_TUPLE`, но создаёт множество.480481Новое в версии 2.7.482483**`BUILD_MAP`(*count*)**484485Помещает новый объект словаря в стек. Словарь предварительно настраивается на хранение *count* записей.486487**`LOAD_ATTR`(*namei*)**488489Заменяет TOS на `getattr(TOS, co_names[namei])`.490491**`COMPARE_OP`(*opname*)**492493Выполняет логическую операцию. Имя операции можно найти в `cmp_op[opname]`.494495**`IMPORT_NAME`(*namei*)**496497Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и предоставляют аргументы *fromlist* и *level* для [`__import__()`](https://python-all.ru/2.7/library/functions.html#__import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректного оператора import последующая инструкция `STORE_FAST` изменяет пространство имён.498499**`IMPORT_FROM`(*namei*)**500501Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией `STORE_FAST`.502503**`JUMP_FORWARD`(*delta*)**504505Увеличивает счётчик байт-кода на *delta*.506507**`POP_JUMP_IF_TRUE`(*target*)**508509Если TOS истинно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.510511**`POP_JUMP_IF_FALSE`(*target*)**512513Если TOS ложно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.514515**`JUMP_IF_TRUE_OR_POP`(*target*)**516517Если TOS истинно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.518519**`JUMP_IF_FALSE_OR_POP`(*target*)**520521Если TOS ложно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.522523**`JUMP_ABSOLUTE`(*target*)**524525Устанавливает счётчик байткода в *target*.526527**`FOR_ITER`(*delta*)**528529`TOS` – это [итератор](https://python-all.ru/2.7/glossary.html#term-iterator). Вызвать его метод `next()`. Если он возвращает новое значение, поместить его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, `TOS` извлекается, и счётчик байткода увеличивается на *delta*.530531**`LOAD_GLOBAL`(*namei*)**532533Загружает глобальную переменную `co_names[namei]` в стек.534535**`SETUP_LOOP`(*delta*)**536537Помещает блок для цикла в стек блоков. Блок начинается с текущей инструкции и имеет размер *delta* байт.538539**`SETUP_EXCEPT`(*delta*)**540541Помещает блок try из конструкции try-except в стек блоков. *delta* указывает на первый блок except.542543**`SETUP_FINALLY`(*delta*)**544545Pushes a try block from a try-except clause onto the block stack. *delta* points to the finally block.546547**`STORE_MAP`()**548549Сохраняет пару ключ-значение в словаре. Извлекает ключ и значение, оставляя словарь в стеке.550551**`LOAD_FAST`(*var\_num*)**552553Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.554555**`STORE_FAST`(*var\_num*)**556557Сохраняет TOS в локальную переменную `co_varnames[var_num]`.558559**`DELETE_FAST`(*var\_num*)**560561Удаляет локальную переменную `co_varnames[var_num]`.562563**`LOAD_CLOSURE`(*i*)**564565Помещает ссылку на ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Имя переменной – `co_cellvars[i]`, если *i* меньше длины *co\_cellvars*. В противном случае – `co_freevars[i - len(co_cellvars)]`.566567**`LOAD_DEREF`(*i*)**568569Загружает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.570571**`STORE_DEREF`(*i*)**572573Сохраняет TOS в ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных.574575**`SET_LINENO`(*lineno*)**576577Этот опкод устарел.578579**`RAISE_VARARGS`(*argc*)**580581Вызывает исключение. *argc* указывает количество аргументов инструкции raise, от 0 до 3. Обработчик находит traceback как TOS2, параметр как TOS1, а исключение как TOS.582583**`CALL_FUNCTION`(*argc*)**584585Вызывает вызываемый объект. Младший байт *argc* указывает количество позиционных аргументов, старший байт – количество именованных аргументов. Стек содержит именованные аргументы сверху (если есть), затем позиционные аргументы под ними (если есть), затем вызываемый объект под ними. Каждый именованный аргумент представлен двумя значениями в стеке: имя аргумента и его значение, при этом значение аргумента находится выше имени в стеке. Позиционные аргументы помещаются в стек в порядке передачи вызываемому объекту, причём самый правый позиционный аргумент – сверху. `CALL_FUNCTION` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом.586587**`MAKE_FUNCTION`(*argc*)**588589Помещает новый объект функции в стек. TOS – это код, связанный с функцией. Функция определяется как имеющая *argc* параметров по умолчанию, которые находятся ниже TOS.590591**`MAKE_CLOSURE`(*argc*)**592593Создаёт новый объект функции, устанавливает его слот *func\_closure* и помещает его в стек. TOS – это код, связанный с функцией, TOS1 – кортеж, содержащий ячейки для свободных переменных замыкания. Функция также имеет *argc* параметров по умолчанию, которые находятся ниже ячеек.594595**`BUILD_SLICE`(*argc*)**596597Помещает объект среза в стек. *argc* должен быть 2 или 3. Если равно 2, помещается `slice(TOS1, TOS)`; если 3, помещается `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/2.7/library/functions.html#slice).598599**`EXTENDED_ARG`(*ext*)**600601Добавляет префикс к любой опкоду, чей аргумент слишком велик, чтобы поместиться в стандартные два байта. *ext* содержит два дополнительных байта, которые вместе с аргументом последующего опкода образуют четырёхбайтовый аргумент, причём *ext* является двумя старшими байтами.602603**`CALL_FUNCTION_VAR`(*argc*)**604605Вызывает вызываемый объект, аналогично [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). *argc* представляет количество ключевых и позиционных аргументов, так же как [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). Вершина стека содержит итерируемый объект с дополнительными позиционными аргументами. Под ним находятся ключевые аргументы (если есть), позиционные аргументы (если есть) и вызываемый объект, так же как [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). Перед вызовом вызываемого объекта итерируемый объект «распаковывается», и его содержимое добавляется к переданным позиционным аргументам. Итерируемый объект игнорируется при вычислении значения `argc`.606607**`CALL_FUNCTION_KW`(*argc*)**608609Вызывает вызываемый объект, аналогично [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). *argc* представляет количество ключевых и позиционных аргументов, так же как [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). Вершина стека содержит отображение (mapping) с дополнительными ключевыми аргументами. Под ним находятся ключевые аргументы (если есть), позиционные аргументы (если есть) и вызываемый объект, так же как [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). Перед вызовом вызываемого объекта отображение на вершине стека «распаковывается», и его содержимое добавляется к переданным ключевым аргументам. Отображение на вершине стека игнорируется при вычислении значения `argc`.610611**`CALL_FUNCTION_VAR_KW`(*argc*)**612613Вызывает вызываемый объект, аналогично [`CALL_FUNCTION_VAR`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION_VAR) и [`CALL_FUNCTION_KW`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION_KW). *argc* представляет количество ключевых и позиционных аргументов, так же как [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). Вершина стека содержит отображение, как в [`CALL_FUNCTION_KW`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION_KW). Под ним находится итерируемый объект, как в [`CALL_FUNCTION_VAR`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION_VAR). Под ними находятся ключевые аргументы (если есть), позиционные аргументы (если есть) и вызываемый объект, так же как [`CALL_FUNCTION`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION). Перед вызовом вызываемого объекта отображение и итерируемый объект «распаковываются», и их содержимое передаётся как ключевые и позиционные аргументы соответственно, так же как в [`CALL_FUNCTION_VAR`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION_VAR) и [`CALL_FUNCTION_KW`](https://python-all.ru/2.7/library/dis.html#opcode-CALL_FUNCTION_KW). Отображение и итерируемый объект игнорируются при вычислении значения `argc`.614615**`HAVE_ARGUMENT`()**616617Это не совсем опкод. Он определяет разделительную линию между опкодами, которые не принимают аргументы `< HAVE_ARGUMENT`, и теми, которые принимают `>= HAVE_ARGUMENT`.618