code.md
1> **Источник:** https://python-all.ru/3.11/c-api/code.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты кода89Объекты кода – это низкоуровневая деталь реализации CPython. Каждый из них представляет блок исполняемого кода, который ещё не привязан к функции.1011#### `type PyCodeObject`1213C-структура объектов, используемых для описания объектов кода. Поля этого типа могут быть изменены в любое время.1415#### `PyTypeObject PyCode_Type`1617Это экземпляр [`PyTypeObject`](https://python-all.ru/3.11/c-api/type.html#c.PyTypeObject), представляющий [объект кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects) Python.1819#### `int PyCode_Check(PyObject *co)`2021Возвращает true, если *co* является [объектом кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects). Эта функция всегда выполняется успешно.2223#### `int PyCode_GetNumFree(PyCodeObject *co)`2425Возвращает количество свободных переменных в *co*.2627#### `PyCodeObject *PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)`2829*Возвращаемое значение: новая ссылка.*3031Возвращает новый объект кода. Если нужен фиктивный объект кода для создания фрейма, используйте [`PyCode_NewEmpty()`](https://python-all.ru/3.11/c-api/code.html#c.PyCode_NewEmpty). Прямой вызов [`PyCode_New()`](https://python-all.ru/3.11/c-api/code.html#c.PyCode_New) привяжет к точной версии Python, поскольку определение байт-кода часто меняется. Многочисленные аргументы этой функции сложным образом взаимозависимы, поэтому незначительные изменения значений могут привести к некорректному выполнению или сбою виртуальной машины. Используйте эту функцию только с крайней осторожностью.3233Изменено в версии 3.11: Добавлены параметры `qualname` и `exceptiontable`.3435#### `PyCodeObject *PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)`3637*Возвращаемое значение: новая ссылка.*3839Аналогично [`PyCode_New()`](https://python-all.ru/3.11/c-api/code.html#c.PyCode_New), но с дополнительным параметром “posonlyargcount” для позиционных аргументов. Те же предостережения, что и для `PyCode_New`, применимы к этой функции.4041Новое в версии 3.8.4243Изменено в версии 3.11: Добавлены параметры `qualname` и `exceptiontable`.4445#### `PyCodeObject *PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)`4647*Возвращаемое значение: новая ссылка.*4849Возвращает новый пустой объект кода с указанными именем файла, именем функции и номером первой строки. Полученный объект кода вызовет `Exception` при выполнении.5051#### `int PyCode_Addr2Line(PyCodeObject *co, int byte_offset)`5253Возвращает номер строки инструкции, которая начинается до или на `byte_offset` и заканчивается после него. Если нужен просто номер строки фрейма, используйте [`PyFrame_GetLineNumber()`](https://python-all.ru/3.11/c-api/frame.html#c.PyFrame_GetLineNumber).5455Для эффективного перебора номеров строк в объекте кода используйте [API, описанное в PEP 626](https://python-all.ru/3.11/c-api/code.html).5657#### `int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)`5859Устанавливает переданные указатели `int` на номера строки и столбца исходного кода для инструкции по адресу `byte_offset`. Устанавливает значение `0`, если информация для какого-либо элемента недоступна.6061Возвращает `1` при успехе функции и 0 в противном случае.6263Новое в версии 3.11.6465#### `PyObject *PyCode_GetCode(PyCodeObject *co)`6667Эквивалент кода Python `getattr(co, 'co_code')`. Возвращает сильную ссылку на [`PyBytesObject`](https://python-all.ru/3.11/c-api/bytes.html#c.PyBytesObject), представляющий байт-код в объекте кода. В случае ошибки возвращается `NULL` и возбуждается исключение.6869Этот `PyBytesObject` может быть создан интерпретатором по требованию и не обязательно представляет байт-код, который действительно выполняется CPython. Основное назначение этой функции – отладчики и профилировщики.7071Новое в версии 3.11.7273#### `PyObject *PyCode_GetVarnames(PyCodeObject *co)`7475Эквивалент кода Python `getattr(co, 'co_varnames')`. Возвращает новую ссылку на [`PyTupleObject`](https://python-all.ru/3.11/c-api/tuple.html#c.PyTupleObject), содержащий имена локальных переменных. В случае ошибки возвращается `NULL` и возбуждается исключение.7677Новое в версии 3.11.7879#### `PyObject *PyCode_GetCellvars(PyCodeObject *co)`8081Эквивалент кода Python `getattr(co, 'co_cellvars')`. Возвращает новую ссылку на [`PyTupleObject`](https://python-all.ru/3.11/c-api/tuple.html#c.PyTupleObject), содержащий имена локальных переменных, на которые ссылаются вложенные функции. В случае ошибки возвращается `NULL` и возбуждается исключение.8283Новое в версии 3.11.8485#### `PyObject *PyCode_GetFreevars(PyCodeObject *co)`8687Эквивалентно коду Python `getattr(co, 'co_freevars')`. Возвращает новую ссылку на [`PyTupleObject`](https://python-all.ru/3.11/c-api/tuple.html#c.PyTupleObject), содержащий имена свободных переменных. В случае ошибки возвращается `NULL` и возбуждается исключение.8889Новое в версии 3.11.90