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

structures.md

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

1> **Источник:** https://python-all.ru/3.12/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.12/c-api/structures.html#c.PyObject) и [`PyVarObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyVarObject), которые, в свою очередь, определяются расширениями некоторых макросов, также используемых (прямо или косвенно) в определении всех остальных объектов Python. Дополнительные макросы можно найти в разделе [подсчёт ссылок](https://python-all.ru/3.12/c-api/refcounting.html#countingrefs).1415#### `type PyObject`1617*Часть [Limited API](https://python-all.ru/3.12/c-api/stable.html#stable). (Только некоторые члены являются частью стабильного ABI.)*1819Все типы объектов являются расширениями этого типа. Это тип, который содержит информацию, необходимую Python для обработки указателя на объект как объекта. В обычной «релизной» сборке он содержит только счетчик ссылок объекта и указатель на соответствующий объект типа. Ничто не объявлено как [`PyObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyObject), но любой указатель на объект Python может быть приведен к [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*. Доступ к членам должен осуществляться с помощью макросов [`Py_REFCNT`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_REFCNT) и [`Py_TYPE`](https://python-all.ru/3.12/c-api/structures.html#c.Py_TYPE).2021#### `type PyVarObject`2223*Часть [Limited API](https://python-all.ru/3.12/c-api/stable.html#stable). (Только некоторые члены являются частью стабильного ABI.)*2425Это расширение [`PyObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyObject), добавляющее поле [`ob_size`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyVarObject.ob_size). Он используется только для объектов, которые имеют некоторое понятие *длины*. Этот тип не часто встречается в Python/C API. Доступ к членам должен осуществляться с помощью макросов [`Py_REFCNT`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_REFCNT), [`Py_TYPE`](https://python-all.ru/3.12/c-api/structures.html#c.Py_TYPE) и [`Py_SIZE`](https://python-all.ru/3.12/c-api/structures.html#c.Py_SIZE).2627#### `PyObject_HEAD`2829Это макрос, используемый при объявлении новых типов, представляющих объекты без изменяемой длины. Макрос PyObject\_HEAD раскрывается в:3031```c32PyObject ob_base;33```3435См. документацию [`PyObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyObject) выше.3637#### `PyObject_VAR_HEAD`3839Это макрос, используемый при объявлении новых типов, представляющих объекты с длиной, которая меняется от экземпляра к экземпляру. Макрос PyObject\_VAR\_HEAD раскрывается в:4041```c42PyVarObject ob_base;43```4445См. документацию [`PyVarObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyVarObject) выше.4647#### `PyTypeObject PyBaseObject_Type`4849*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*5051Базовый класс всех остальных объектов, аналогичен [`object`](https://python-all.ru/3.12/library/functions.html#object) в Python.5253#### `int Py_Is(PyObject *x, PyObject *y)`5455*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) начиная с версии 3.10.*5657Проверяет, является ли объект *x* тем же объектом, что и *y*, аналогично `x is y` в Python.5859Добавлено в версии 3.10.6061#### `int Py_IsNone(PyObject *x)`6263*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) начиная с версии 3.10.*6465Проверяет, является ли объект синглтоном `None`, аналогично `x is None` в Python.6667Добавлено в версии 3.10.6869#### `int Py_IsTrue(PyObject *x)`7071*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) начиная с версии 3.10.*7273Проверяет, является ли объект синглтоном `True`, аналогично `x is True` в Python.7475Добавлено в версии 3.10.7677#### `int Py_IsFalse(PyObject *x)`7879*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) начиная с версии 3.10.*8081Проверяет, является ли объект синглтоном `False`, аналогично `x is False` в Python.8283Добавлено в версии 3.10.8485#### `PyTypeObject *Py_TYPE(PyObject *o)`8687Возвращает тип объекта Python *o*.8889Возвращает [заимствованную ссылку](https://python-all.ru/3.12/glossary.html#term-borrowed-reference).9091Для установки типа объекта используется функция [`Py_SET_TYPE()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_SET_TYPE).9293Изменено в версии 3.11: [`Py_TYPE()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_TYPE) изменён на встроенную статическую функцию. Тип параметра больше не const [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*.9495#### `int Py_IS_TYPE(PyObject *o, PyTypeObject *type)`9697Возвращает ненулевое значение, если тип объекта *o* равен *type*. В противном случае возвращает нуль. Эквивалентно `Py_TYPE(o) == type`.9899Добавлено в версии 3.9.100101#### `void Py_SET_TYPE(PyObject *o, PyTypeObject *type)`102103Устанавливает тип объекта *o* в *type*.104105Добавлено в версии 3.9.106107#### `Py_ssize_t Py_SIZE(PyVarObject *o)`108109Возвращает размер объекта Python *o*.110111Для установки размера объекта используется функция [`Py_SET_SIZE()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_SET_SIZE).112113Изменено в версии 3.11: [`Py_SIZE()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_SIZE) изменён на встроенную статическую функцию. Тип параметра больше не const [PyVarObject](https://python-all.ru/3.12/c-api/structures.html#c.PyVarObject)\*.114115#### `void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)`116117Устанавливает размер объекта *o* в *size*.118119Добавлено в версии 3.9.120121#### `PyObject_HEAD_INIT(type)`122123Это макрос, который раскрывается в значения инициализации для нового типа [`PyObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyObject). Этот макрос раскрывается в:124125```c126_PyObject_EXTRA_INIT1271, type,128```129130#### `PyVarObject_HEAD_INIT(type, size)`131132Это макрос, который разворачивается в значения инициализации для нового типа [`PyVarObject`](https://python-all.ru/3.12/c-api/structures.html#c.PyVarObject), включая поле [`ob_size`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyVarObject.ob_size). Этот макрос разворачивается в:133134```c135_PyObject_EXTRA_INIT1361, type, size,137```138139## Реализация функций и методов140141#### `type PyCFunction`142143*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*144145Тип функций, используемых для реализации большинства вызываемых объектов Python на C. Функции этого типа принимают два параметра [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\* и возвращают одно такое значение. Если возвращаемое значение равно `NULL`, должно быть установлено исключение. Если не `NULL`, возвращаемое значение интерпретируется как возвращаемое значение функции, доступной в Python. Функция должна возвращать новую ссылку.146147Сигнатура функции:148149```c150PyObject *PyCFunction(PyObject *self,151                      PyObject *args);152```153154#### `type PyCFunctionWithKeywords`155156*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*157158Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_VARARGS | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-varargs-meth-keywords). Сигнатура функции:159160```c161PyObject *PyCFunctionWithKeywords(PyObject *self,162                                  PyObject *args,163                                  PyObject *kwargs);164```165166#### `type _PyCFunctionFast`167168Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [`METH_FASTCALL`](https://python-all.ru/3.12/c-api/structures.html#c.METH_FASTCALL). Сигнатура функции:169170```c171PyObject *_PyCFunctionFast(PyObject *self,172                           PyObject *const *args,173                           Py_ssize_t nargs);174```175176#### `type _PyCFunctionFastWithKeywords`177178Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-fastcall-meth-keywords). Сигнатура функции:179180```c181PyObject *_PyCFunctionFastWithKeywords(PyObject *self,182                                       PyObject *const *args,183                                       Py_ssize_t nargs,184                                       PyObject *kwnames);185```186187#### `type PyCMethod`188189Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-method-meth-fastcall-meth-keywords). Сигнатура функции:190191```c192PyObject *PyCMethod(PyObject *self,193                    PyTypeObject *defining_class,194                    PyObject *const *args,195                    Py_ssize_t nargs,196                    PyObject *kwnames)197```198199Добавлено в версии 3.9.200201#### `type PyMethodDef`202203*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) (включая все члены).*204205Структура, используемая для описания метода типа-расширения. Эта структура имеет четыре поля:206207#### `const char *ml_name`208209Имя метода.210211#### `PyCFunction ml_meth`212213Указатель на реализацию на C.214215#### `int ml_flags`216217Битовые флаги, указывающие, как должен быть построен вызов.218219#### `const char *ml_doc`220221Указывает на содержимое строки документации.222223[`ml_meth`](https://python-all.ru/3.12/c-api/structures.html#c.PyMethodDef.ml_meth) – это указатель на функцию C. Функции могут быть разных tипов, но они всегда возвращают [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*. Если функция не относится к [`PyCFunction`](https://python-all.ru/3.12/c-api/structures.html#c.PyCFunction), компилятор потребует приведения типов в таблице методов. Хотя [`PyCFunction`](https://python-all.ru/3.12/c-api/structures.html#c.PyCFunction) определяет первый параметр как [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*, обычно реализация метода использует конкретный тип C объекта *self*.224225Поле [`ml_flags`](https://python-all.ru/3.12/c-api/structures.html#c.PyMethodDef.ml_flags) – это битовое поле, которое может содержать следующие флаги. Отдельные флаги указывают либо соглашение о вызове, либо соглашение о связывании.226227Существуют следующие соглашения о вызове:228229#### `METH_VARARGS`230231Это типичное соглашение о вызове, при котором методы имеют тип [`PyCFunction`](https://python-all.ru/3.12/c-api/structures.html#c.PyCFunction). Функция ожидает два значения [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*. Первое – это объект *self* для методов; для функций модуля это объект модуля. Второй параметр (часто называемый *args*) – это объект-кортеж, представляющий все аргументы. Этот параметр обычно обрабатывается с помощью [`PyArg_ParseTuple()`](https://python-all.ru/3.12/c-api/arg.html#c.PyArg_ParseTuple) или [`PyArg_UnpackTuple()`](https://python-all.ru/3.12/c-api/arg.html#c.PyArg_UnpackTuple).232233#### `METH_KEYWORDS`234235Может использоваться только в определённых комбинациях с другими флагами: [METH\_VARARGS | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-varargs-meth-keywords), [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-fastcall-meth-keywords) и [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-method-meth-fastcall-meth-keywords).236237**[METH\_VARARGS](https://python-all.ru/3.12/c-api/structures.html#c.METH_VARARGS) | [METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#c.METH_KEYWORDS)**238239Методы с этими флагами должны быть типа [`PyCFunctionWithKeywords`](https://python-all.ru/3.12/c-api/structures.html#c.PyCFunctionWithKeywords). Функция ожидает три параметра: *self*, *args*, *kwargs*, где *kwargs* – это словарь всех именованных аргументов или `NULL`, если именованных аргументов нет. Параметры обычно обрабатываются с помощью [`PyArg_ParseTupleAndKeywords()`](https://python-all.ru/3.12/c-api/arg.html#c.PyArg_ParseTupleAndKeywords).240241#### `METH_FASTCALL`242243Быстрое соглашение о вызове, поддерживающее только позиционные аргументы. Методы имеют тип [`_PyCFunctionFast`](https://python-all.ru/3.12/c-api/structures.html#c._PyCFunctionFast). Первый параметр – *self*, второй параметр – массив C из значений [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*, указывающих аргументы, а третий параметр – количество аргументов (длина массива).244245Добавлено в версии 3.7.246247Изменено в версии 3.10: `METH_FASTCALL` теперь является частью [стабильного ABI](https://python-all.ru/3.12/c-api/stable.html#stable-abi).248249**[METH\_FASTCALL](https://python-all.ru/3.12/c-api/structures.html#c.METH_FASTCALL) | [METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#c.METH_KEYWORDS)**250251Расширение [`METH_FASTCALL`](https://python-all.ru/3.12/c-api/structures.html#c.METH_FASTCALL), также поддерживающее именованные аргументы, с методами типа [`_PyCFunctionFastWithKeywords`](https://python-all.ru/3.12/c-api/structures.html#c._PyCFunctionFastWithKeywords). Именованные аргументы передаются так же, как в [протоколе vectorcall](https://python-all.ru/3.12/c-api/call.html#vectorcall): добавляется четвёртый параметр [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*, который является кортежем, представляющим имена именованных аргументов (гарантированно строки) или `NULL`, если ключевых слов нет. Значения именованных аргументов хранятся в массиве *args* после позиционных аргументов.252253Добавлено в версии 3.7.254255#### `METH_METHOD`256257Может использоваться только в комбинации с другими флагами: [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-method-meth-fastcall-meth-keywords).258259**[METH\_METHOD](https://python-all.ru/3.12/c-api/structures.html#c.METH_METHOD) | [METH\_FASTCALL](https://python-all.ru/3.12/c-api/structures.html#c.METH_FASTCALL) | [METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#c.METH_KEYWORDS)**260261Расширение [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.12/c-api/structures.html#meth-fastcall-meth-keywords), поддерживающее *определяющий класс*, то есть класс, который содержит данный метод. Определяющий класс может быть суперклассом `Py_TYPE(self)`.262263Метод должен быть типа [`PyCMethod`](https://python-all.ru/3.12/c-api/structures.html#c.PyCMethod), как и для `METH_FASTCALL | METH_KEYWORDS` с добавленным аргументом `defining_class` после `self`.264265Добавлено в версии 3.9.266267#### `METH_NOARGS`268269Методы без параметров не должны проверять, переданы ли аргументы, если они перечислены с флагом [`METH_NOARGS`](https://python-all.ru/3.12/c-api/structures.html#c.METH_NOARGS). Они должны быть типа [`PyCFunction`](https://python-all.ru/3.12/c-api/structures.html#c.PyCFunction). Первый параметр обычно называется *self* и будет содержать ссылку на модуль или экземпляр объекта. Во всех случаях второй параметр будет `NULL`.270271Функция должна иметь 2 параметра. Поскольку второй параметр не используется, [`Py_UNUSED`](https://python-all.ru/3.12/c-api/intro.html#c.Py_UNUSED) можно использовать для предотвращения предупреждения компилятора.272273#### `METH_O`274275Методы с одним объектным аргументом могут быть перечислены с флагом [`METH_O`](https://python-all.ru/3.12/c-api/structures.html#c.METH_O) вместо вызова [`PyArg_ParseTuple()`](https://python-all.ru/3.12/c-api/arg.html#c.PyArg_ParseTuple) с аргументом `"O"`. Они имеют тип [`PyCFunction`](https://python-all.ru/3.12/c-api/structures.html#c.PyCFunction), с параметром *self* и параметром [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\*, представляющим единственный аргумент.276277Эти две константы не используются для указания соглашения о вызовах, а для привязки при использовании с методами классов. Они не могут использоваться для функций, определённых для модулей. Для любого данного метода может быть установлен не более чем один из этих флагов.278279#### `METH_CLASS`280281Метод получит объект типа в качестве первого параметра, а не экземпляр типа. Это используется для создания *методов класса*, аналогично тому, что создаётся при использовании [`classmethod()`](https://python-all.ru/3.12/library/functions.html#classmethod) встроенной функции.282283#### `METH_STATIC`284285Метод получит `NULL` в качестве первого параметра, а не экземпляр типа. Это используется для создания *статических методов*, аналогично тому, что создаётся при использовании встроенной функции [`staticmethod()`](https://python-all.ru/3.12/library/functions.html#staticmethod).286287Ещё одна константа управляет тем, загружается ли метод вместо другого определения с тем же именем метода.288289#### `METH_COEXIST`290291Метод будет загружен вместо существующих определений. Без *METH\_COEXIST* по умолчанию повторяющиеся определения пропускаются. Поскольку обёртки слотов загружаются до таблицы методов, наличие слота *sq\_contains*, например, приведёт к созданию обёрнутого метода с именем [`__contains__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__contains__) и предотвратит загрузку соответствующего PyCFunction с тем же именем. При установленном флаге PyCFunction будет загружен вместо объекта-обёртки и будет сосуществовать со слотом. Это полезно, поскольку вызовы PyCFunctions оптимизированы лучше, чем вызовы объектов-обёрток.292293#### `PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)`294295*Возвращаемое значение: новая ссылка.*296297*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) с версии 3.9.*298299Преобразует *ml* в объект Python [callable](https://python-all.ru/3.12/glossary.html#term-callable). Вызывающий код должен гарантировать, что *ml* переживёт [callable](https://python-all.ru/3.12/glossary.html#term-callable). Обычно *ml* определяется как статическая переменная.300301Параметр *self* будет передан как аргумент *self* в C-функцию из `ml->ml_meth` при вызове. *self* может быть `NULL`.302303Атрибут `__module__` объекта [callable](https://python-all.ru/3.12/glossary.html#term-callable) можно задать из аргумента *module*. *module* должна быть строкой Python, которая будет использоваться как имя модуля, в котором определена функция. Если это недоступно, можно задать [`None`](https://python-all.ru/3.12/library/constants.html#None) или `NULL`.304305> **См. также**306>307> [`function.__module__`](https://python-all.ru/3.12/reference/datamodel.html#function.__module__)308309Параметр *cls* будет передан как аргумент *defining\_class* в C-функцию. Должен быть задан, если [`METH_METHOD`](https://python-all.ru/3.12/c-api/structures.html#c.METH_METHOD) установлен на `ml->ml_flags`.310311Добавлено в версии 3.9.312313#### `PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)`314315*Возвращаемое значение: новая ссылка.*316317*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*318319Эквивалентно `PyCMethod_New(ml, self, module, NULL)`.320321#### `PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)`322323*Возвращаемое значение: новая ссылка.*324325*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) с версии 3.4.*326327Эквивалентно `PyCMethod_New(ml, self, NULL, NULL)`.328329## Доступ к атрибутам типов расширений330331#### `type PyMemberDef`332333*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) (включая все члены).*334335Структура, описывающая атрибут типа, соответствующий элементу структуры C. При определении класса поместите массив таких структур, завершающийся NULL, в слот [`tp_members`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_members).336337Его поля, по порядку:338339#### `const char *name`340341Имя элемента. Значение NULL обозначает конец массива `PyMemberDef[]`.342343Строка должна быть статической, её копия не создаётся.344345#### `int type`346347Тип элемента в структуре C. См. [типы элементов](https://python-all.ru/3.12/c-api/structures.html#pymemberdef-types) для возможных значений.348349#### `Py_ssize_t offset`350351Смещение в байтах, по которому элемент находится в структуре объекта типа.352353#### `int flags`354355Ноль или более [флагов элементов](https://python-all.ru/3.12/c-api/structures.html#pymemberdef-flags), объединённых с помощью побитового ИЛИ.356357#### `const char *doc`358359Строка документации (docstring) или NULL. Строка должна быть статической, её копия не создаётся. Обычно она определяется с помощью [`PyDoc_STR`](https://python-all.ru/3.12/c-api/intro.html#c.PyDoc_STR).360361По умолчанию (когда [`flags`](https://python-all.ru/3.12/c-api/structures.html#c.PyMemberDef.flags) равно `0`) элементы допускают как чтение, так и запись. Используйте флаг [`Py_READONLY`](https://python-all.ru/3.12/c-api/structures.html#c.Py_READONLY) для доступа только на чтение. Некоторые типы, например [`Py_T_STRING`](https://python-all.ru/3.12/c-api/structures.html#c.Py_T_STRING), подразумевают [`Py_READONLY`](https://python-all.ru/3.12/c-api/structures.html#c.Py_READONLY). Только элементы [`Py_T_OBJECT_EX`](https://python-all.ru/3.12/c-api/structures.html#c.Py_T_OBJECT_EX) (и устаревшие [`T_OBJECT`](https://python-all.ru/3.12/c-api/structures.html#c.T_OBJECT)) могут быть удалены.362363Для типов, выделяемых в куче (созданных с помощью [`PyType_FromSpec()`](https://python-all.ru/3.12/c-api/type.html#c.PyType_FromSpec) или аналогично), `PyMemberDef` может содержать определение специального члена `"__vectorcalloffset__"`, соответствующего [`tp_vectorcall_offset`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) в объектах типа. Они должны быть определены с `Py_T_PYSSIZET` и `Py_READONLY`, например:364365```c366static PyMemberDef spam_type_members[] = {367    {"__vectorcalloffset__", Py_T_PYSSIZET,368     offsetof(Spam_object, vectorcall), Py_READONLY},369    {NULL}  /* Страж */370};371```372373(Возможно, потребуется `#include <stddef.h>` для `offsetof()`.)374375Устаревшие смещения [`tp_dictoffset`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset) и [`tp_weaklistoffset`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) можно определить аналогично, используя элементы `"__dictoffset__"` и `"__weaklistoffset__"`, однако расширениям настоятельно рекомендуется использовать [`Py_TPFLAGS_MANAGED_DICT`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_DICT) и [`Py_TPFLAGS_MANAGED_WEAKREF`](https://python-all.ru/3.12/c-api/typeobj.html#c.Py_TPFLAGS_MANAGED_WEAKREF) вместо них.376377Изменено в версии 3.12: `PyMemberDef` всегда доступен. Ранее требовалось включение `"structmember.h"`.378379#### `PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)`380381*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*382383Получает атрибут, принадлежащий объекту по адресу *obj\_addr*. Атрибут описывается с помощью `PyMemberDef` *m*. Возвращает `NULL` при ошибке.384385Изменено в версии 3.12: `PyMember_GetOne` всегда доступен. Ранее требовалось включение `"structmember.h"`.386387#### `int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)`388389*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*390391Устанавливает атрибут, принадлежащий объекту по адресу *obj\_addr*, в значение объекта *o*. Устанавливаемый атрибут описывается с помощью `PyMemberDef` *m*. Возвращает `0` в случае успеха и отрицательное значение при ошибке.392393Изменено в версии 3.12: `PyMember_SetOne` всегда доступен. Ранее требовалось включение `"structmember.h"`.394395### Флаги элементов396397Следующие флаги могут использоваться с [`PyMemberDef.flags`](https://python-all.ru/3.12/c-api/structures.html#c.PyMemberDef.flags):398399#### `Py_READONLY`400401Не доступен для записи.402403#### `Py_AUDIT_READ`404405Отправляет `object.__getattr__` [событие аудита](https://python-all.ru/3.12/library/audit_events.html#audit-events) перед чтением.406407#### `Py_RELATIVE_OFFSET`408409Указывает, что [`offset`](https://python-all.ru/3.12/c-api/structures.html#c.PyMemberDef.offset) этой `PyMemberDef` записи является смещением от данных, специфичных для подкласса, а не от `PyObject`.410411Может использоваться только как часть [`Py_tp_members`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_members) [`slot`](https://python-all.ru/3.12/c-api/type.html#c.PyType_Slot) при создании класса с использованием отрицательного [`basicsize`](https://python-all.ru/3.12/c-api/type.html#c.PyType_Spec.basicsize). В этом случае это обязательно.412413Этот флаг используется только в [`PyType_Slot`](https://python-all.ru/3.12/c-api/type.html#c.PyType_Slot). При установке [`tp_members`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_members) во время создания класса Python сбрасывает его и устанавливает [`PyMemberDef.offset`](https://python-all.ru/3.12/c-api/structures.html#c.PyMemberDef.offset) в смещение от структуры `PyObject`.414415Изменено в версии 3.10: Макросы `RESTRICTED`, `READ_RESTRICTED` и `WRITE_RESTRICTED`, доступные с `#include "structmember.h"`, устарели. `READ_RESTRICTED` и `RESTRICTED` эквивалентны [`Py_AUDIT_READ`](https://python-all.ru/3.12/c-api/structures.html#c.Py_AUDIT_READ); `WRITE_RESTRICTED` ничего не делает.416417Изменено в версии 3.12: Макрос `READONLY` был переименован в [`Py_READONLY`](https://python-all.ru/3.12/c-api/structures.html#c.Py_READONLY). Макрос `PY_AUDIT_READ` был переименован с префиксом `Py_`. Новые имена теперь всегда доступны. Ранее для них требовался `#include "structmember.h"`. Заголовочный файл всё ещё доступен и содержит старые имена.418419### Типы членов420421[`PyMemberDef.type`](https://python-all.ru/3.12/c-api/structures.html#c.PyMemberDef.type) может быть одним из следующих макросов, соответствующих различным типам C. Когда поле доступно из Python, оно преобразуется в эквивалентный тип Python. Когда оно устанавливается из Python, оно преобразуется обратно в тип C. Если это невозможно, возникает исключение, такое как [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) или [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError).422423Если не помечено (D), атрибуты, определённые таким образом, нельзя удалить с помощью, например, [`del`](https://python-all.ru/3.12/reference/simple_stmts.html#del) или [`delattr()`](https://python-all.ru/3.12/library/functions.html#delattr).424425| Имя макроса | Тип C | Тип Python |426| --- | --- | --- |427| Py\_T\_BYTE | char | [`int`](https://python-all.ru/3.12/library/functions.html#int) |428| Py\_T\_SHORT | short | [`int`](https://python-all.ru/3.12/library/functions.html#int) |429| Py\_T\_INT | int | [`int`](https://python-all.ru/3.12/library/functions.html#int) |430| Py\_T\_LONG | long | [`int`](https://python-all.ru/3.12/library/functions.html#int) |431| Py\_T\_LONGLONG | long long | [`int`](https://python-all.ru/3.12/library/functions.html#int) |432| Py\_T\_UBYTE | unsigned char | [`int`](https://python-all.ru/3.12/library/functions.html#int) |433| Py\_T\_UINT | unsigned int | [`int`](https://python-all.ru/3.12/library/functions.html#int) |434| Py\_T\_USHORT | unsigned short | [`int`](https://python-all.ru/3.12/library/functions.html#int) |435| Py\_T\_ULONG | unsigned long | [`int`](https://python-all.ru/3.12/library/functions.html#int) |436| Py\_T\_ULONGLONG | unsigned long long | [`int`](https://python-all.ru/3.12/library/functions.html#int) |437| Py\_T\_PYSSIZET | [Py\_ssize\_t](https://python-all.ru/3.12/c-api/intro.html#c.Py_ssize_t) | [`int`](https://python-all.ru/3.12/library/functions.html#int) |438| Py\_T\_FLOAT | float | [`float`](https://python-all.ru/3.12/library/functions.html#float) |439| Py\_T\_DOUBLE | double | [`float`](https://python-all.ru/3.12/library/functions.html#float) |440| Py\_T\_BOOL | char (записывается как 0 или 1) | [`bool`](https://python-all.ru/3.12/library/functions.html#bool) |441| Py\_T\_STRING | const char\* (\*) | [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) (только для чтения) |442| Py\_T\_STRING\_INPLACE | const char\[\] (\*) | [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) (только для чтения) |443| Py\_T\_CHAR | char (0-127) | [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) (\*\*) |444| Py\_T\_OBJECT\_EX | [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\* | [`object`](https://python-all.ru/3.12/library/functions.html#object) (по умолчанию) |445446> (\*): Нуль-терминированная строка C в кодировке UTF-8. С `Py_T_STRING` представление в C – указатель; с `Py_T_STRING_INPLACE` строка хранится непосредственно в структуре.447>448> (\*\*): Строка длиной 1. Допустимы только символы ASCII.449>450> (RO): Подразумевает [`Py_READONLY`](https://python-all.ru/3.12/c-api/structures.html#c.Py_READONLY).451>452> (D): Может быть удалено, в этом случае указатель устанавливается в `NULL`. Чтение указателя `NULL` возбуждает [`AttributeError`](https://python-all.ru/3.12/library/exceptions.html#AttributeError).453454Добавлено в версии 3.12: В предыдущих версиях макросы были доступны только с `#include "structmember.h"` и назывались без префикса `Py_` (например, `T_INT`). Заголовочный файл по-прежнему доступен и содержит старые имена, а также следующие устаревшие типы:455456#### `T_OBJECT`457458Как `Py_T_OBJECT_EX`, но `NULL` преобразуется в `None`. Это приводит к неожиданному поведению в Python: удаление атрибута фактически устанавливает его в `None`.459460#### `T_NONE`461462Всегда `None`. Должен использоваться с [`Py_READONLY`](https://python-all.ru/3.12/c-api/structures.html#c.Py_READONLY).463464### Определение геттеров и сеттеров465466#### `type PyGetSetDef`467468*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable) (включая все члены).*469470Структура для определения доступа по типу свойства для типа. См. также описание слота [`PyTypeObject.tp_getset`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_getset).471472#### `const char *name`473474имя атрибута475476#### `getter get`477478C-функция для получения атрибута.479480#### `setter set`481482Необязательная C-функция для установки или удаления атрибута. Если `NULL`, атрибут доступен только для чтения.483484#### `const char *doc`485486необязательная строка документации487488#### `void *closure`489490Необязательный указатель на пользовательские данные, предоставляющий дополнительные данные для getter и setter.491492#### `typedef PyObject *(*getter)(PyObject*, void*)`493494*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*495496Функция `get` принимает один параметр [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\* (экземпляр) и указатель на пользовательские данные (связанный `closure`):497498В случае успеха должна возвращать новую ссылку или `NULL` с установленным исключением в случае неудачи.499500#### `typedef int (*setter)(PyObject*, PyObject*, void*)`501502*Часть [Stable ABI](https://python-all.ru/3.12/c-api/stable.html#stable).*503504Функции `set` принимают два параметра [PyObject](https://python-all.ru/3.12/c-api/structures.html#c.PyObject)\* (экземпляр и устанавливаемое значение) и указатель на пользовательские данные (связанный `closure`):505506Если атрибут должен быть удален, второй параметр равен `NULL`. В случае успеха должна возвращать `0` или `-1` с установленным исключением в случае неудачи.507