structures.md · Markdown – Документация Python
Документация Python неофициальный перевод

structures.md

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

1> **Источник:** https://python-all.ru/3.15/c-api/structures.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Структуры общих объектов89При определении типов объектов Python используется большое количество структур. В данном разделе описываются эти структуры и принципы их использования.1011## Базовые типы объектов и макросы1213Все объекты Python имеют общие несколько полей в начале своего представления в памяти. Они представлены типами [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject) и [`PyVarObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject), которые, в свою очередь, определяются расширениями некоторых макросов, также используемых (прямо или косвенно) в определении всех остальных объектов Python. Дополнительные макросы можно найти в разделе [подсчёт ссылок](https://python-all.ru/3.15/c-api/refcounting.html#countingrefs).1415#### `type PyObject`1617*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (см. ниже).*1819Все типы объектов являются расширениями этого типа. Это тип, который содержит информацию, необходимую Python для обработки указателя на объект как объекта. В обычной сборке «release» он содержит только счётчик ссылок объекта и указатель на соответствующий объект типа. Ничто на самом деле не объявляется как [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject), но любой указатель на объект Python может быть приведён к [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*.2021К элементам нельзя обращаться напрямую; вместо этого используйте макросы, такие как [`Py_REFCNT`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_REFCNT) и [`Py_TYPE`](https://python-all.ru/3.15/c-api/structures.html#c.Py_TYPE).2223В [стабильном ABI](https://python-all.ru/3.15/c-api/stable.html#stable-abi) для сборок со свободной многопоточностью (`abi3t`) эта структура непрозрачна; её размер и расположение могут меняться между версиями Python. В стабильном ABI для сборок без свободной многопоточности (`abi3`) поля `ob_refcnt` и `ob_type` доступны, но их прямое использование не рекомендуется.2425#### `Py_ssize_t ob_refcnt`2627*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*2829Счётчик ссылок объекта, возвращаемый [`Py_REFCNT`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_REFCNT). Не используйте это поле напрямую; вместо этого используйте функции и макросы, такие как `Py_REFCNT`, [`Py_INCREF()`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_INCREF) и [`Py_DecRef()`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_DecRef).3031Тип поля может отличаться от `Py_ssize_t` в зависимости от конфигурации сборки и платформы.3233#### `PyTypeObject *ob_type`3435*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*3637Тип объекта. Не используйте это поле напрямую; вместо этого используйте [`Py_TYPE`](https://python-all.ru/3.15/c-api/structures.html#c.Py_TYPE) и [`Py_SET_TYPE()`](https://python-all.ru/3.15/c-api/structures.html#c.Py_SET_TYPE).3839#### `PyMutex ob_mutex`4041Блокировка [для каждого объекта](https://python-all.ru/3.15/howto/free-threading-extensions.html#per-object-locks), присутствующая только в [сборке со свободной многопоточностью](https://python-all.ru/3.15/glossary.html#term-free-threading) (когда определён [`Py_GIL_DISABLED`](https://python-all.ru/3.15/using/configure.html#c.Py_GIL_DISABLED)).4243Это поле **зарезервировано для использования API критической секции** ([`Py_BEGIN_CRITICAL_SECTION`](https://python-all.ru/3.15/c-api/synchronization.html#c.Py_BEGIN_CRITICAL_SECTION) / [`Py_END_CRITICAL_SECTION`](https://python-all.ru/3.15/c-api/synchronization.html#c.Py_END_CRITICAL_SECTION)). **Не** блокируйте его напрямую с помощью `PyMutex_Lock`; это может привести к взаимоблокировкам. Если вам нужна собственная блокировка, добавьте отдельное поле [`PyMutex`](https://python-all.ru/3.15/c-api/synchronization.html#c.PyMutex) в структуру вашего объекта.4445Добавлено в версии 3.13.4647#### `type PyVarObject`4849*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (см. ниже).*5051Расширение [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject), добавляющее поле [`ob_size`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject.ob_size). Предназначено для объектов, имеющих некоторое понятие *длины*.5253Как и в случае с `PyObject`, к элементам нельзя обращаться напрямую; вместо этого используйте макросы, такие как [`Py_SIZE`](https://python-all.ru/3.15/c-api/structures.html#c.Py_SIZE), [`Py_REFCNT`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_REFCNT) и [`Py_TYPE`](https://python-all.ru/3.15/c-api/structures.html#c.Py_TYPE).5455В [стабильном ABI](https://python-all.ru/3.15/c-api/stable.html#stable-abi) для сборок со свободной многопоточностью (`abi3t`) эта структура непрозрачна; её размер и расположение могут меняться между версиями Python. В стабильном ABI для сборок без свободной многопоточности (`abi3`) поля `ob_base` и `ob_size` доступны, но их прямое использование не рекомендуется.5657#### `PyObject ob_base`5859*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*6061Общий заголовок объекта. Обычно к этому полю не обращаются напрямую; вместо этого `PyVarObject` может быть приведён к [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject).6263#### `Py_ssize_t ob_size`6465*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*6667Поле размера, содержимое которого следует считать внутренней деталью реализации объекта.6869Не используйте это поле напрямую; вместо этого используйте [`Py_SIZE`](https://python-all.ru/3.15/c-api/structures.html#c.Py_SIZE).7071Функции создания объектов, такие как [`PyObject_NewVar()`](https://python-all.ru/3.15/c-api/allocation.html#c.PyObject_NewVar), обычно устанавливают это поле в запрошенный размер (количество элементов). После создания в `ob_size` можно сохранять произвольные значения с помощью [`Py_SET_SIZE`](https://python-all.ru/3.15/c-api/structures.html#c.Py_SET_SIZE).7273Чтобы получить публично доступную длину объекта, возвращаемую функцией Python [`len()`](https://python-all.ru/3.15/library/functions.html#len), используйте [`PyObject_Length()`](https://python-all.ru/3.15/c-api/object.html#c.PyObject_Length).7475#### `PyObject_HEAD`7677Это макрос, используемый при объявлении новых типов, представляющих объекты без изменяемой длины. Макрос PyObject\_HEAD раскрывается в:7879```c80PyObject ob_base;81```8283См. документацию [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject) выше.8485#### `PyObject_VAR_HEAD`8687Это макрос, используемый при объявлении новых типов, представляющих объекты с длиной, которая меняется от экземпляра к экземпляру. Макрос PyObject\_VAR\_HEAD раскрывается в:8889```c90PyVarObject ob_base;91```9293См. документацию [`PyVarObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject) выше.9495#### `PyTypeObject PyBaseObject_Type`9697*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*9899Базовый класс всех остальных объектов, аналогичен [`object`](https://python-all.ru/3.15/library/functions.html#object) в Python.100101#### `int Py_Is(PyObject *x, PyObject *y)`102103*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*104105Проверяет, является ли объект *x* тем же объектом, что и *y*, аналогично `x is y` в Python.106107Добавлено в версии 3.10.108109#### `int Py_IsNone(PyObject *x)`110111*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*112113Проверяет, является ли объект синглтоном `None`, аналогично `x is None` в Python.114115Добавлено в версии 3.10.116117#### `int Py_IsTrue(PyObject *x)`118119*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*120121Проверяет, является ли объект синглтоном `True`, аналогично `x is True` в Python.122123Добавлено в версии 3.10.124125#### `int Py_IsFalse(PyObject *x)`126127*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*128129Проверяет, является ли объект синглтоном `False`, аналогично `x is False` в Python.130131Добавлено в версии 3.10.132133#### `PyTypeObject *Py_TYPE(PyObject *o)`134135*Возвращаемое значение: заёмная ссылка.*136137*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.14.*138139Возвращает тип объекта Python *o*.140141Возвращаемая ссылка является [заёмной](https://python-all.ru/3.15/glossary.html#term-borrowed-reference) из *o*. Не освобождайте её с помощью [`Py_DECREF()`](https://python-all.ru/3.15/c-api/refcounting.html#c.Py_DECREF) или аналогичных средств.142143Изменено в версии 3.11: [`Py_TYPE()`](https://python-all.ru/3.15/c-api/structures.html#c.Py_TYPE) изменён на встроенную статическую функцию. Тип параметра больше не const [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*.144145#### `int Py_IS_TYPE(PyObject *o, PyTypeObject *type)`146147*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*148149Возвращает ненулевое значение, если тип объекта *o* равен *type*. В противном случае возвращает нуль. Эквивалентно `Py_TYPE(o) == type`.150151Добавлено в версии 3.9.152153#### `void Py_SET_TYPE(PyObject *o, PyTypeObject *type)`154155Устанавливает тип объекта *o* в *type* без какой-либо проверки или подсчёта ссылок.156157Это операция очень низкого уровня. Вместо этого рекомендуется устанавливать атрибут Python [`__class__`](https://python-all.ru/3.15/reference/datamodel.html#object.__class__) с помощью [`PyObject_SetAttrString()`](https://python-all.ru/3.15/c-api/object.html#c.PyObject_SetAttrString) или аналогичного.158159Обратите внимание, что присвоение несовместимого типа может привести к неопределённому поведению.160161Если *type* является [кучным типом (heap type)](https://python-all.ru/3.15/c-api/typeobj.html#heap-types), вызывающий должен создать новую ссылку на него. Аналогично, если старый тип *o* является кучным типом, вызывающий должен освободить ссылку на этот тип.162163Добавлено в версии 3.9.164165#### `Py_ssize_t Py_SIZE(PyVarObject *o)`166167*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*168169Возвращает поле [`ob_size`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject.ob_size) объекта *o*.170171Изменено в версии 3.11: [`Py_SIZE()`](https://python-all.ru/3.15/c-api/structures.html#c.Py_SIZE) изменён на встроенную статическую функцию. Тип параметра больше не const [PyVarObject](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject)\*.172173#### `void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)`174175*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*176177Устанавливает поле [`ob_size`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject.ob_size) объекта *o* в *size*.178179Добавлено в версии 3.9.180181#### `PyObject_HEAD_INIT(type)`182183Это макрос, который раскрывается в значения инициализации для нового типа [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject). Этот макрос раскрывается в:184185```c186_PyObject_EXTRA_INIT1871, type,188```189190#### `PyVarObject_HEAD_INIT(type, size)`191192Это макрос, который разворачивается в значения инициализации для нового типа [`PyVarObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject), включая поле [`ob_size`](https://python-all.ru/3.15/c-api/structures.html#c.PyVarObject.ob_size). Этот макрос разворачивается в:193194```c195_PyObject_EXTRA_INIT1961, type, size,197```198199## Реализация функций и методов200201#### `type PyCFunction`202203*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*204205Тип функций, используемых для реализации большинства вызываемых объектов Python на C. Функции этого типа принимают два параметра [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\* и возвращают одно такое значение. Если возвращаемое значение равно `NULL`, должно быть установлено исключение. Если не `NULL`, возвращаемое значение интерпретируется как возвращаемое значение функции, доступной в Python. Функция должна возвращать новую ссылку.206207Сигнатура функции:208209```c210PyObject *PyCFunction(PyObject *self,211                      PyObject *args);212```213214#### `type PyCFunctionWithKeywords`215216*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*217218Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_VARARGS | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-varargs-meth-keywords). Сигнатура функции:219220```c221PyObject *PyCFunctionWithKeywords(PyObject *self,222                                  PyObject *args,223                                  PyObject *kwargs);224```225226#### `type PyCFunctionFast`227228*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable), начиная с версии 3.13.*229230Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [`METH_FASTCALL`](https://python-all.ru/3.15/c-api/structures.html#c.METH_FASTCALL). Сигнатура функции:231232```c233PyObject *PyCFunctionFast(PyObject *self,234                          PyObject *const *args,235                          Py_ssize_t nargs);236```237238#### `type PyCFunctionFastWithKeywords`239240*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable), начиная с версии 3.13.*241242Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-fastcall-meth-keywords). Сигнатура функции:243244```c245PyObject *PyCFunctionFastWithKeywords(PyObject *self,246                                      PyObject *const *args,247                                      Py_ssize_t nargs,248                                      PyObject *kwnames);249```250251#### `type PyCMethod`252253Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-method-meth-fastcall-meth-keywords). Сигнатура функции:254255```c256PyObject *PyCMethod(PyObject *self,257                    PyTypeObject *defining_class,258                    PyObject *const *args,259                    Py_ssize_t nargs,260                    PyObject *kwnames)261```262263Добавлено в версии 3.9.264265#### `type PyMethodDef`266267*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (включая все члены).*268269Структура, используемая для описания метода типа-расширения. Эта структура имеет четыре поля:270271#### `const char *ml_name`272273Имя метода.274275`NULL` *ml\_name* обозначает конец массива `PyMethodDef`.276277#### `PyCFunction ml_meth`278279Указатель на реализацию на C.280281#### `int ml_flags`282283Битовые флаги, указывающие, как должен быть построен вызов.284285#### `const char *ml_doc`286287Указывает на содержимое строки документации.288289[`ml_meth`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef.ml_meth) – это указатель на функцию C. Функции могут быть разных типов, но они всегда возвращают [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*. Если функция не относится к [`PyCFunction`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction), компилятор потребует приведения типа в таблице методов. Несмотря на то, что `PyCFunction` определяет первый параметр как PyObject\*, обычно реализация метода использует конкретный тип C объекта *self*.290291Поле [`ml_flags`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef.ml_flags) – это битовое поле, которое может содержать следующие флаги. Отдельные флаги указывают либо соглашение о вызове, либо соглашение о связывании.292293Существуют следующие соглашения о вызове:294295#### `METH_VARARGS`296297*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*298299Это типичное соглашение о вызове, при котором методы имеют тип [`PyCFunction`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction). Функция ожидает два значения [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*. Первое – это объект *self* для методов; для функций модуля это объект модуля. Второй параметр (часто называемый *args*) – это объект-кортеж, представляющий все аргументы. Этот параметр обычно обрабатывается с помощью [`PyArg_ParseTuple()`](https://python-all.ru/3.15/c-api/arg.html#c.PyArg_ParseTuple) или [`PyArg_UnpackTuple()`](https://python-all.ru/3.15/c-api/arg.html#c.PyArg_UnpackTuple).300301#### `METH_KEYWORDS`302303Может использоваться только в определённых комбинациях с другими флагами: [METH\_VARARGS | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-varargs-meth-keywords), [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-fastcall-meth-keywords) и [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-method-meth-fastcall-meth-keywords).304305**[METH\_VARARGS](https://python-all.ru/3.15/c-api/structures.html#c.METH_VARARGS) | [METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#c.METH_KEYWORDS)**306307Методы с этими флагами должны быть типа [`PyCFunctionWithKeywords`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunctionWithKeywords). Функция ожидает три параметра: *self*, *args*, *kwargs*, где *kwargs* – это словарь всех именованных аргументов или `NULL`, если именованных аргументов нет. Параметры обычно обрабатываются с помощью [`PyArg_ParseTupleAndKeywords()`](https://python-all.ru/3.15/c-api/arg.html#c.PyArg_ParseTupleAndKeywords).308309#### `METH_FASTCALL`310311*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.10.*312313Быстрое соглашение о вызове, поддерживающее только позиционные аргументы. Методы имеют тип [`PyCFunctionFast`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunctionFast). Первый параметр – *self*, второй параметр – массив C из значений [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*, указывающих аргументы, а третий параметр – количество аргументов (длина массива).314315Добавлено в версии 3.7.316317Изменено в версии 3.10: `METH_FASTCALL` теперь является частью [стабильного ABI](https://python-all.ru/3.15/c-api/stable.html#stable-abi).318319**[METH\_FASTCALL](https://python-all.ru/3.15/c-api/structures.html#c.METH_FASTCALL) | [METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#c.METH_KEYWORDS)**320321Расширение [`METH_FASTCALL`](https://python-all.ru/3.15/c-api/structures.html#c.METH_FASTCALL), также поддерживающее именованные аргументы, с методами типа [`PyCFunctionFastWithKeywords`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunctionFastWithKeywords). Именованные аргументы передаются так же, как в [протоколе vectorcall](https://python-all.ru/3.15/c-api/call.html#vectorcall): добавляется четвёртый параметр [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*, который является кортежем, представляющим имена именованных аргументов (гарантированно строки) или `NULL`, если ключевых слов нет. Значения именованных аргументов хранятся в массиве *args* после позиционных аргументов.322323Добавлено в версии 3.7.324325#### `METH_METHOD`326327*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.7.*328329Может использоваться только в комбинации с другими флагами: [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-method-meth-fastcall-meth-keywords).330331**[METH\_METHOD](https://python-all.ru/3.15/c-api/structures.html#c.METH_METHOD) | [METH\_FASTCALL](https://python-all.ru/3.15/c-api/structures.html#c.METH_FASTCALL) | [METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#c.METH_KEYWORDS)**332333Расширение [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.15/c-api/structures.html#meth-fastcall-meth-keywords), поддерживающее *определяющий класс*, то есть класс, который содержит данный метод. Определяющий класс может быть суперклассом `Py_TYPE(self)`.334335Метод должен быть типа [`PyCMethod`](https://python-all.ru/3.15/c-api/structures.html#c.PyCMethod), как и для `METH_FASTCALL | METH_KEYWORDS` с добавленным аргументом `defining_class` после `self`.336337Добавлено в версии 3.9.338339#### `METH_NOARGS`340341*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*342343Методы без параметров не должны проверять, переданы ли аргументы, если они перечислены с флагом [`METH_NOARGS`](https://python-all.ru/3.15/c-api/structures.html#c.METH_NOARGS). Они должны быть типа [`PyCFunction`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction). Первый параметр обычно называется *self* и будет содержать ссылку на модуль или экземпляр объекта. Во всех случаях второй параметр будет `NULL`.344345Функция должна иметь 2 параметра. Поскольку второй параметр не используется, [`Py_UNUSED`](https://python-all.ru/3.15/c-api/intro.html#c.Py_UNUSED) можно использовать для предотвращения предупреждения компилятора.346347#### `METH_O`348349*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*350351Методы с одним объектным аргументом могут быть перечислены с флагом [`METH_O`](https://python-all.ru/3.15/c-api/structures.html#c.METH_O) вместо вызова [`PyArg_ParseTuple()`](https://python-all.ru/3.15/c-api/arg.html#c.PyArg_ParseTuple) с аргументом `"O"`. Они имеют тип [`PyCFunction`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction), с параметром *self* и параметром [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*, представляющим единственный аргумент.352353Эти две константы используются не для указания соглашения о вызове, а для привязки при использовании с методами классов. Они не могут использоваться для функций, определённых для модулей. Для любого заданного метода может быть установлен не более одного из этих флагов.354355#### `METH_CLASS`356357*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*358359Метод получит объект типа в качестве первого параметра, а не экземпляр типа. Это используется для создания *методов класса*, аналогично тому, что создаётся при использовании [`classmethod()`](https://python-all.ru/3.15/library/functions.html#classmethod) встроенной функции.360361#### `METH_STATIC`362363*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*364365Метод получит `NULL` в качестве первого параметра, а не экземпляр типа. Это используется для создания *статических методов*, аналогично тому, что создаётся при использовании встроенной функции [`staticmethod()`](https://python-all.ru/3.15/library/functions.html#staticmethod).366367Ещё одна константа управляет тем, загружается ли метод вместо другого определения с тем же именем метода.368369#### `METH_COEXIST`370371*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*372373Метод будет загружен вместо существующих определений. Без *METH\_COEXIST* по умолчанию повторяющиеся определения пропускаются. Поскольку обёртки слотов загружаются до таблицы методов, наличие слота *sq\_contains*, например, приведёт к созданию обёрнутого метода с именем [`__contains__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__contains__) и предотвратит загрузку соответствующего PyCFunction с тем же именем. При установленном флаге PyCFunction будет загружен вместо объекта-обёртки и будет сосуществовать со слотом. Это полезно, поскольку вызовы PyCFunctions оптимизированы лучше, чем вызовы объектов-обёрток.374375#### `PyTypeObject PyCMethod_Type`376377Объект типа, соответствующий объектам методов C Python. Доступен как [`types.BuiltinMethodType`](https://python-all.ru/3.15/library/types.html#types.BuiltinMethodType) в слое Python.378379#### `int PyCMethod_Check(PyObject *op)`380381Возвращает true, если *op* является экземпляром типа [`PyCMethod_Type`](https://python-all.ru/3.15/c-api/structures.html#c.PyCMethod_Type) или его подтипом. Эта функция всегда выполняется успешно.382383#### `int PyCMethod_CheckExact(PyObject *op)`384385То же, что и [`PyCMethod_Check()`](https://python-all.ru/3.15/c-api/structures.html#c.PyCMethod_Check), но не учитывает подтипы.386387#### `PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)`388389*Возвращаемое значение: новая ссылка.*390391*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) с версии 3.9.*392393Преобразует *ml* в Python-объект [вызываемый](https://python-all.ru/3.15/glossary.html#term-callable). Вызывающий код должен гарантировать, что *ml* переживёт вызываемый объект. Обычно *ml* определяется как статическая переменная.394395Параметр *self* будет передан как аргумент *self* в C-функцию из `ml->ml_meth` при вызове. *self* может быть `NULL`.396397Атрибут `__module__` объекта [callable](https://python-all.ru/3.15/glossary.html#term-callable) можно задать из аргумента *module*. *module* должна быть строкой Python, которая будет использоваться как имя модуля, в котором определена функция. Если это недоступно, можно задать [`None`](https://python-all.ru/3.15/library/constants.html#None) или `NULL`.398399> **См. также**400>401> [`function.__module__`](https://python-all.ru/3.15/reference/datamodel.html#function.__module__)402403Параметр *cls* будет передан как аргумент *defining\_class* в C-функцию. Должен быть задан, если [`METH_METHOD`](https://python-all.ru/3.15/c-api/structures.html#c.METH_METHOD) установлен на `ml->ml_flags`.404405Добавлено в версии 3.9.406407#### `PyTypeObject PyCFunction_Type`408409*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*410411Объект типа, соответствующий объектам C-функций Python. Доступен как [`types.BuiltinFunctionType`](https://python-all.ru/3.15/library/types.html#types.BuiltinFunctionType) на уровне Python.412413#### `int PyCFunction_Check(PyObject *op)`414415Возвращает true, если *op* является экземпляром типа [`PyCFunction_Type`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction_Type) или его подтипом. Эта функция всегда выполняется успешно.416417#### `int PyCFunction_CheckExact(PyObject *op)`418419То же, что и [`PyCFunction_Check()`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction_Check), но не учитывает подтипы.420421#### `PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)`422423*Возвращаемое значение: новая ссылка.*424425*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*426427Эквивалентно `PyCMethod_New(ml, self, module, NULL)`.428429#### `PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)`430431*Возвращаемое значение: новая ссылка.*432433*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) с версии 3.4.*434435Эквивалентно `PyCMethod_New(ml, self, NULL, NULL)`.436437#### `int PyCFunction_GetFlags(PyObject *func)`438439*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*440441Получает флаги функции для *func*, переданные в [`ml_flags`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef.ml_flags).442443Если *func* не является объектом C-функции, возникает исключение. *func* не должен быть `NULL`.444445Эта функция возвращает флаги функции в случае успеха и `-1` с установленным исключением в случае неудачи.446447#### `int PyCFunction_GET_FLAGS(PyObject *func)`448449То же, что и [`PyCFunction_GetFlags()`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction_GetFlags), но без проверки ошибок или типа.450451#### `PyCFunction PyCFunction_GetFunction(PyObject *func)`452453*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*454455Получает указатель на функцию для *func*, переданный в [`ml_meth`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef.ml_meth).456457Если *func* не является объектом C-функции, возникает исключение. *func* не должен быть `NULL`.458459Эта функция возвращает указатель на функцию в случае успеха и `NULL` с установленным исключением в случае неудачи.460461#### `int PyCFunction_GET_FUNCTION(PyObject *func)`462463То же, что и [`PyCFunction_GetFunction()`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction_GetFunction), но без проверки ошибок или типа.464465#### `PyObject *PyCFunction_GetSelf(PyObject *func)`466467*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*468469Получает объект «self» для *func*. Это объект, который будет передан первым аргументом [`PyCFunction`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction). Для объектов C-функций, созданных через [`PyMethodDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef) на [`PyModuleDef`](https://python-all.ru/3.15/c-api/module.html#c.PyModuleDef), это результирующий объект модуля.470471Если *func* не является объектом C-функции, возникает исключение. *func* не должен быть `NULL`.472473Эта функция возвращает [заимствованную ссылку](https://python-all.ru/3.15/glossary.html#term-borrowed-reference) на объект «self» в случае успеха и `NULL` с установленным исключением в случае неудачи.474475#### `PyObject *PyCFunction_GET_SELF(PyObject *func)`476477То же, что и [`PyCFunction_GetSelf()`](https://python-all.ru/3.15/c-api/structures.html#c.PyCFunction_GetSelf), но без проверки ошибок или типа.478479## Доступ к атрибутам типов расширений480481#### `type PyMemberDef`482483*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (включая все члены).*484485Структура, описывающая атрибут типа, соответствующий элементу структуры C. При определении класса поместите массив таких структур, завершающийся NULL, в слот [`tp_members`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_members).486487Его поля, по порядку:488489#### `const char *name`490491Имя элемента. Значение NULL обозначает конец массива `PyMemberDef[]`.492493Строка должна быть статической, её копия не создаётся.494495#### `int type`496497Тип элемента в структуре C. См. [типы элементов](https://python-all.ru/3.15/c-api/structures.html#pymemberdef-types) для возможных значений.498499#### `Py_ssize_t offset`500501Смещение в байтах, по которому элемент находится в структуре объекта типа.502503#### `int flags`504505Ноль или более [флагов элементов](https://python-all.ru/3.15/c-api/structures.html#pymemberdef-flags), объединённых с помощью побитового ИЛИ.506507#### `const char *doc`508509Строка документации (docstring) или NULL. Строка должна быть статической, её копия не создаётся. Обычно она определяется с помощью [`PyDoc_STR`](https://python-all.ru/3.15/c-api/intro.html#c.PyDoc_STR).510511По умолчанию (когда [`flags`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef.flags) равно `0`) элементы допускают как чтение, так и запись. Используйте флаг [`Py_READONLY`](https://python-all.ru/3.15/c-api/structures.html#c.Py_READONLY) для доступа только на чтение. Некоторые типы, например [`Py_T_STRING`](https://python-all.ru/3.15/c-api/structures.html#c.Py_T_STRING), подразумевают `Py_READONLY`. Только элементы [`Py_T_OBJECT_EX`](https://python-all.ru/3.15/c-api/structures.html#c.Py_T_OBJECT_EX) (и устаревшие [`T_OBJECT`](https://python-all.ru/3.15/c-api/structures.html#c.T_OBJECT)) могут быть удалены.512513Для типов, выделяемых в куче (созданных с помощью [`PyType_FromSpec()`](https://python-all.ru/3.15/c-api/type.html#c.PyType_FromSpec) или аналогично), `PyMemberDef` может содержать определение специального элемента `"__vectorcalloffset__"`, соответствующего [`tp_vectorcall_offset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) в объектах типа. Этот элемент должен быть определён с `Py_T_PYSSIZET` и либо `Py_READONLY`, либо `Py_READONLY | Py_RELATIVE_OFFSET`. Например:514515```c516static PyMemberDef spam_type_members[] = {517    {"__vectorcalloffset__", Py_T_PYSSIZET,518     offsetof(Spam_object, vectorcall), Py_READONLY},519    {NULL}  /* Страж */520};521```522523(Возможно, потребуется `#include <stddef.h>` для `offsetof()`.)524525Устаревшие смещения [`tp_dictoffset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) и [`tp_weaklistoffset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) можно определить аналогично, используя элементы `"__dictoffset__"` и `"__weaklistoffset__"`, однако расширениям настоятельно рекомендуется использовать [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) и [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) вместо них.526527Изменено в версии 3.12: `PyMemberDef` всегда доступен. Ранее требовалось включение `"structmember.h"`.528529Изменено в версии 3.14: [`Py_RELATIVE_OFFSET`](https://python-all.ru/3.15/c-api/structures.html#c.Py_RELATIVE_OFFSET) теперь разрешён для `"__vectorcalloffset__"`, `"__dictoffset__"` и `"__weaklistoffset__"`.530531#### `PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)`532533*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*534535Получает атрибут, принадлежащий объекту по адресу *obj\_addr*. Атрибут описывается с помощью `PyMemberDef` *m*. Возвращает `NULL` при ошибке.536537Изменено в версии 3.12: `PyMember_GetOne` всегда доступен. Ранее требовалось включение `"structmember.h"`.538539#### `int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)`540541*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*542543Устанавливает атрибут, принадлежащий объекту по адресу *obj\_addr*, в значение объекта *o*. Устанавливаемый атрибут описывается с помощью `PyMemberDef` *m*. Возвращает `0` в случае успеха и отрицательное значение при ошибке.544545Изменено в версии 3.12: `PyMember_SetOne` всегда доступен. Ранее требовалось включение `"structmember.h"`.546547### Флаги элементов548549Следующие флаги могут использоваться с [`PyMemberDef.flags`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef.flags):550551#### `Py_READONLY`552553*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.*554555Не доступен для записи.556557#### `Py_AUDIT_READ`558559*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.*560561Отправляет `object.__getattr__` [событие аудита](https://python-all.ru/3.15/library/audit_events.html#audit-events) перед чтением.562563#### `Py_RELATIVE_OFFSET`564565*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.*566567Указывает, что [`offset`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef.offset) этой `PyMemberDef` записи является смещением от данных, специфичных для подкласса, а не от `PyObject`.568569Может использоваться только как часть [`Py_tp_members`](https://python-all.ru/3.15/c-api/typeobj.html#c.Py_tp_members) [`slot`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Slot) при создании класса с использованием отрицательных [`basicsize`](https://python-all.ru/3.15/c-api/type.html#c.PyType_Spec.basicsize). В этом случае это обязательно. При установке [`tp_members`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_members) из слота во время создания класса Python сбрасывает флаг и устанавливает [`PyMemberDef.offset`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef.offset) в смещение от структуры `PyObject`.570571Изменено в версии 3.10: Макросы `RESTRICTED`, `READ_RESTRICTED` и `WRITE_RESTRICTED`, доступные с `#include "structmember.h"`, устарели. `READ_RESTRICTED` и `RESTRICTED` эквивалентны [`Py_AUDIT_READ`](https://python-all.ru/3.15/c-api/structures.html#c.Py_AUDIT_READ); `WRITE_RESTRICTED` ничего не делает.572573Изменено в версии 3.12: Макрос `READONLY` был переименован в [`Py_READONLY`](https://python-all.ru/3.15/c-api/structures.html#c.Py_READONLY). Макрос `PY_AUDIT_READ` был переименован с префиксом `Py_`. Новые имена теперь всегда доступны. Ранее для них требовался `#include "structmember.h"`. Заголовочный файл всё ещё доступен и содержит старые имена.574575### Типы членов576577[`PyMemberDef.type`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef.type) может быть одним из следующих макросов, соответствующих различным типам C. Когда поле доступно из Python, оно преобразуется в эквивалентный тип Python. Когда оно устанавливается из Python, оно преобразуется обратно в тип C. Если это невозможно, возникает исключение, такое как [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) или [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).578579Если не помечено (D), атрибуты, определённые таким образом, нельзя удалить с помощью, например, [`del`](https://python-all.ru/3.15/reference/simple_stmts.html#del) или [`delattr()`](https://python-all.ru/3.15/library/functions.html#delattr).580581| Имя макроса | Тип C | Тип Python |582| --- | --- | --- |583| Py\_T\_BYTE *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | char | [`int`](https://python-all.ru/3.15/library/functions.html#int) |584| Py\_T\_SHORT *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | short | [`int`](https://python-all.ru/3.15/library/functions.html#int) |585| Py\_T\_INT *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | int | [`int`](https://python-all.ru/3.15/library/functions.html#int) |586| Py\_T\_LONG *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | long | [`int`](https://python-all.ru/3.15/library/functions.html#int) |587| Py\_T\_LONGLONG *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | long long | [`int`](https://python-all.ru/3.15/library/functions.html#int) |588| Py\_T\_UBYTE *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | unsigned char | [`int`](https://python-all.ru/3.15/library/functions.html#int) |589| Py\_T\_UINT *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | unsigned int | [`int`](https://python-all.ru/3.15/library/functions.html#int) |590| Py\_T\_USHORT *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | unsigned short | [`int`](https://python-all.ru/3.15/library/functions.html#int) |591| Py\_T\_ULONG *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | unsigned long | [`int`](https://python-all.ru/3.15/library/functions.html#int) |592| Py\_T\_ULONGLONG *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | unsigned long long | [`int`](https://python-all.ru/3.15/library/functions.html#int) |593| Py\_T\_PYSSIZET *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | [Py\_ssize\_t](https://python-all.ru/3.15/c-api/intro.html#c.Py_ssize_t) | [`int`](https://python-all.ru/3.15/library/functions.html#int) |594| Py\_T\_FLOAT *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | float | [`float`](https://python-all.ru/3.15/library/functions.html#float) |595| Py\_T\_DOUBLE *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | double | [`float`](https://python-all.ru/3.15/library/functions.html#float) |596| Py\_T\_BOOL *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | char (записывается как 0 или 1) | [`bool`](https://python-all.ru/3.15/library/functions.html#bool) |597| Py\_T\_STRING *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | const char\* (\*) | [`str`](https://python-all.ru/3.15/library/stdtypes.html#str) (только для чтения) |598| Py\_T\_STRING\_INPLACE *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | const char\[\] (\*) | [`str`](https://python-all.ru/3.15/library/stdtypes.html#str) (только для чтения) |599| Py\_T\_CHAR *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | char (0-127) | [`str`](https://python-all.ru/3.15/library/stdtypes.html#str) (\*\*) |600| Py\_T\_OBJECT\_EX *Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.12.* | [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\* | [`object`](https://python-all.ru/3.15/library/functions.html#object) (по умолчанию) |601602> (\*): Нуль-терминированная строка C в кодировке UTF-8. С `Py_T_STRING` представление в C – указатель; с `Py_T_STRING_INPLACE` строка хранится непосредственно в структуре.603>604> (\*\*): Строка длиной 1. Допустимы только символы ASCII.605>606> (RO): Подразумевает [`Py_READONLY`](https://python-all.ru/3.15/c-api/structures.html#c.Py_READONLY).607>608> (D): Может быть удалено, в этом случае указатель устанавливается в `NULL`. Чтение указателя `NULL` возбуждает [`AttributeError`](https://python-all.ru/3.15/library/exceptions.html#AttributeError).609610Добавлено в версии 3.12: В предыдущих версиях макросы были доступны только с `#include "structmember.h"` и назывались без префикса `Py_` (например, `T_INT`). Заголовочный файл по-прежнему доступен и содержит старые имена, а также следующие устаревшие типы:611612#### `T_OBJECT`613614Как `Py_T_OBJECT_EX`, но `NULL` преобразуется в `None`. Это приводит к неожиданному поведению в Python: удаление атрибута фактически устанавливает его в `None`.615616#### `T_NONE`617618Всегда `None`. Должен использоваться с [`Py_READONLY`](https://python-all.ru/3.15/c-api/structures.html#c.Py_READONLY).619620### Определение геттеров и сеттеров621622#### `type PyGetSetDef`623624*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) (включая все члены).*625626Структура для определения доступа по типу свойства для типа. См. также описание слота [`PyTypeObject.tp_getset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_getset).627628#### `const char *name`629630имя атрибута631632#### `getter get`633634C-функция для получения атрибута.635636#### `setter set`637638Необязательная C-функция для установки или удаления атрибута. Если `NULL`, атрибут доступен только для чтения.639640#### `const char *doc`641642необязательная строка документации643644#### `void *closure`645646Необязательный указатель на пользовательские данные, предоставляющий дополнительные данные для getter и setter.647648#### `typedef PyObject *(*getter)(PyObject*, void*)`649650*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*651652Функция `get` принимает один параметр [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\* (экземпляр) и указатель на пользовательские данные (связанный `closure`):653654В случае успеха должна возвращать новую ссылку или `NULL` с установленным исключением в случае неудачи.655656#### `typedef int (*setter)(PyObject*, PyObject*, void*)`657658*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*659660Функции `set` принимают два параметра [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\* (экземпляр и устанавливаемое значение) и указатель на пользовательские данные (связанный `closure`):661662Если атрибут должен быть удален, второй параметр равен `NULL`. В случае успеха должна возвращать `0` или `-1` с установленным исключением в случае неудачи.663