Общие структуры объектов
Существует большое количество структур, используемых при определении типов объектов в Python. В этом разделе описываются эти структуры и способы их использования.
Базовые типы объектов и макросы
Все объекты Python в конечном итоге разделяют небольшое количество полей в начале представления объекта в памяти. Они представлены типами PyObject и PyVarObject, которые, в свою очередь, определяются с помощью некоторых макросов, также используемых, напрямую или косвенно, при определении всех остальных объектов Python. Дополнительные макросы можно найти в разделе счётчик ссылок.
-
type PyObject -
Часть Ограниченного API. (Только некоторые члены являются частью стабильного ABI.)
Все типы объектов являются расширениями этого типа. Это тип, содержащий информацию, необходимую Python для обработки указателя на объект как объекта. В обычном «выпуске» он содержит только счётчик ссылок объекта и указатель на соответствующий объект типа. Ничего фактически не объявляется как
PyObject, но каждый указатель на объект Python может быть приведён к типу PyObject*. Доступ к членам должен осуществляться с использованием макросовPy_REFCNTиPy_TYPE.
-
type PyVarObject -
Часть Ограниченного API. (Только некоторые члены являются частью стабильного ABI.)
Это расширение
PyObject, добавляющее полеob_size. Оно используется только для объектов, имеющих понятие длины. Этот тип редко встречается в Python/C API. Доступ к членам должен осуществляться с использованием макросовPy_REFCNT,Py_TYPEиPy_SIZE.
-
PyObject_HEAD -
Это макрос, используемый при объявлении новых типов, представляющих объекты без переменной длины. Макрос PyObject_HEAD расширяется до:
PyObject ob_base;
См. документацию по
PyObjectвыше.
-
PyObject_VAR_HEAD -
Это макрос, используемый при объявлении новых типов, представляющих объекты с длиной, которая меняется от экземпляра к экземпляру. Макрос PyObject_VAR_HEAD расширяется до:
PyVarObject ob_base;
См. документацию по
PyVarObjectвыше.
-
int Py_Is(PyObject *x, PyObject *y) -
Часть Стабильного ABI с версии 3.10.
Проверка, является ли объект x объектом y, то же самое, что и
x is yв Python.Добавлен в версии 3.10.
-
int Py_IsNone(PyObject *x) -
Часть Стабильного ABI с версии 3.10.
Проверка, является ли объект одиночным объектом
None, то же самое, что иx is Noneв Python.Добавлен в версии 3.10.
-
int Py_IsTrue(PyObject *x) -
Часть Стабильного ABI с версии 3.10.
Проверка, является ли объект одиночным объектом
True, то же самое, что иx is Trueв Python.Добавлен в версии 3.10.
-
int Py_IsFalse(PyObject *x) -
Часть Стабильного ABI с версии 3.10.
Проверка, является ли объект одиночным объектом
False, то же самое, что иx is Falseв Python.Добавлен в версии 3.10.
-
PyTypeObject *Py_TYPE(PyObject *o) -
Значение возврата: Заимствованная ссылка.
Получение типа объекта Python o.
Возвращает заимствованную ссылку.
Используйте функцию
Py_SET_TYPE()для установки типа объекта.
-
int Py_IS_TYPE(PyObject *o, PyTypeObject *type) -
Возвращает ненулевое значение, если тип объекта o равен type. В противном случае возвращает ноль. Эквивалентно:
Py_TYPE(o) == type.Добавлен в версии 3.9.
-
void Py_SET_TYPE(PyObject *o, PyTypeObject *type) -
Устанавливает тип объекта o на type.
Добавлен в версии 3.9.
-
Py_ssize_t Py_SIZE(PyVarObject *o) -
Получение размера объекта Python o.
Используйте функцию
Py_SET_SIZE()для установки размера объекта.Изменено в версии 3.11:
Py_SIZE()изменено на статическую встроенную функцию. Тип параметра больше не const PyVarObject*.
-
void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) -
Устанавливает размер объекта o на size.
Добавлен в версии 3.9.
-
PyObject_HEAD_INIT(type) -
Этот макрос расширяется до значений инициализации нового типа
PyObject. Этот макрос расширяется до:_PyObject_EXTRA_INIT 1, type,
-
PyVarObject_HEAD_INIT(type, size) -
Этот макрос расширяется до значений инициализации нового типа
PyVarObject, включая полеob_size. Этот макрос расширяется до:_PyObject_EXTRA_INIT 1, type, size,
Реализация функций и методов
-
type PyCFunction -
Часть Стабильного ABI.
Тип функций, используемых для реализации большинства вызываемых из Python объектов в C. Функции этого типа принимают два параметра PyObject* и возвращают одно такое значение. Если возвращаемое значение равно
NULL, то должно быть установлено исключение. Если неNULL, возвращаемое значение интерпретируется как возвращаемое значение функции, как оно представлено в Python. Функция должна возвращать новую ссылку.Подпись функции:
PyObject *PyCFunction(PyObject *self, PyObject *args);
-
type PyCFunctionWithKeywords -
Часть Стабильного ABI.
Тип функций, используемых для реализации вызываемых из Python объектов в C с подписью METH_VARARGS | METH_KEYWORDS. Подпись функции:
PyObject *PyCFunctionWithKeywords(PyObject *self, PyObject *args, PyObject *kwargs);
-
type PyCFunctionFast -
Часть Стабильного ABI с версии 3.13.
Тип функций, используемых для реализации вызываемых из Python объектов в C с подписью
METH_FASTCALL. Подпись функции:PyObject *PyCFunctionFast(PyObject *self, PyObject *const *args, Py_ssize_t nargs);
-
type PyCFunctionFastWithKeywords -
Часть Стабильного ABI с версии 3.13.
Тип функций, используемых для реализации вызываемых из Python объектов в C с подписью METH_FASTCALL | METH_KEYWORDS. Подпись функции:
PyObject *PyCFunctionFastWithKeywords(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames);
-
type PyCMethod -
Тип функций, используемых для реализации вызываемых из Python объектов в C с подписью METH_METHOD | METH_FASTCALL | METH_KEYWORDS. Подпись функции:
PyObject *PyCMethod(PyObject *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)Добавлена в версии 3.9.
-
type PyMethodDef -
Часть Стабильного ABI (включая все члены).
Структура, используемая для описания метода типа расширения. Эта структура имеет четыре поля:
-
const char *ml_name -
Имя метода.
-
PyCFunction ml_meth -
Указатель на реализацию на C.
-
int ml_flags -
Флаги, указывающие, как должна быть построена вызов.
-
const char *ml_doc -
Указывает на содержимое строковой документации.
-
Значение ml_meth — указатель на функцию C. Функции могут быть разных типов, но они всегда возвращают PyObject*. Если функция не является типа PyCFunction, компилятор потребует приведение типов в таблице методов. Несмотря на то, что PyCFunction определяет первый параметр как PyObject*, часто реализация метода использует конкретный тип C объекта self.
Поле ml_flags — битовое поле, которое может включать следующие флаги. Отдельные флаги указывают либо на соглашение о вызове, либо на соглашение о связывании.
Существуют эти соглашения о вызове:
-
METH_VARARGS -
Это типичное соглашение о вызове, где методы имеют тип
PyCFunction. Функция ожидает два значения PyObject*. Первое — объект self для методов; для функций модуля — объект модуля. Второй параметр (часто называемый args) — объект кортежа, представляющий все аргументы. Этот параметр обычно обрабатывается с помощьюPyArg_ParseTuple()илиPyArg_UnpackTuple().
-
METH_KEYWORDS -
Может использоваться только в определённых сочетаниях с другими флагами: METH_VARARGS | METH_KEYWORDS, METH_FASTCALL | METH_KEYWORDS и METH_METHOD | METH_FASTCALL | METH_KEYWORDS.
- METH_VARARGS | METH_KEYWORDS
-
Методы с этими флагами должны быть типа
PyCFunctionWithKeywords. Функция ожидает три параметра: self, args, kwargs, где kwargs — словарь всех именованных аргументов или, возможно,NULLесли именованных аргументов нет. Параметры обычно обрабатываются с помощьюPyArg_ParseTupleAndKeywords().
-
METH_FASTCALL -
Быстрое соглашение о вызове, поддерживающее только позиционные аргументы. Методы имеют тип
PyCFunctionFast. Первый параметр — self, второй параметр — массив C из значений PyObject*, указывающих на аргументы, и третий параметр — количество аргументов (длина массива).Добавлена в версии 3.7.
Изменено в версии 3.10:
METH_FASTCALLтеперь является частью стабильного ABI.
- METH_FASTCALL | METH_KEYWORDS
-
Расширение
METH_FASTCALL, поддерживающее также именованные аргументы, с методами типаPyCFunctionFastWithKeywords. Именованные аргументы передаются так же, как в протоколе vectorcall: есть дополнительный четвёртый параметр PyObject*, который является кортежем, представляющим имена именованных аргументов (которые гарантированно являются строками) или, возможно,NULLесли именованных аргументов нет. Значения именованных аргументов хранятся в массиве args после позиционных аргументов.Добавлена в версии 3.7.
-
METH_METHOD -
Может использоваться только в сочетании с другими флагами: METH_METHOD | METH_FASTCALL | METH_KEYWORDS.
- METH_METHOD | METH_FASTCALL | METH_KEYWORDS
-
Расширение METH_FASTCALL | METH_KEYWORDS, поддерживающее определяемый класс, то есть класс, который содержит данный метод. Определяемый класс может быть суперклассом
Py_TYPE(self).Метод должен иметь тип
PyCMethod, такой же, как и дляMETH_FASTCALL | METH_KEYWORDS, с добавленным аргументомdefining_classпослеself.Добавлен в версии 3.9.
-
METH_NOARGS -
Методы без параметров не нуждаются в проверке наличия аргументов, если они перечислены со флагом
METH_NOARGS. Они должны иметь типPyCFunction. Первый параметр обычно называется self и будет содержать ссылку на модуль или экземпляр объекта. Во всех случаях второй параметр будетNULL.Функция должна иметь 2 параметра. Поскольку второй параметр не используется, можно использовать
Py_UNUSED, чтобы предотвратить предупреждение компилятора.
-
METH_O -
Методы с одним объектным аргументом могут быть перечислены со флагом
METH_Oвместо вызоваPyArg_ParseTuple()с аргументом"O". Они имеют типPyCFunction, с параметром self и параметром PyObject*, представляющим единственный аргумент.
Эти две константы не используются для указания соглашения вызова, а для связывания при использовании с методами классов. Их нельзя использовать для функций, определённых для модулей. Для любого данного метода может быть установлен не более одного из этих флагов.
-
METH_CLASS -
Методу будет передан объект типа в качестве первого параметра вместо экземпляра типа. Это используется для создания методов класса, аналогично тому, что создаётся при использовании встроенной функции
classmethod().
-
METH_STATIC -
Методу будет передан
NULLв качестве первого параметра вместо экземпляра типа. Это используется для создания статических методов, аналогично тому, что создаётся при использовании встроенной функцииstaticmethod().
Ещё одна константа управляет тем, загружается ли метод вместо другого определения с тем же именем метода.
-
METH_COEXIST -
Метод будет загружен вместо существующих определений. Без METH_COEXIST по умолчанию повторяющиеся определения пропускаются. Поскольку обёртки слотов загружаются до таблицы методов, существование, например, слота sq_contains сгенерировало бы обёрнутый метод, названный
__contains__(), и помешало бы загрузке соответствующего PyCFunction с тем же именем. При определении флага PyCFunction будет загружен вместо объекта-обёртки и будет сосуществовать с слотом. Это полезно, потому что вызовы PyCFunction оптимизированы больше, чем вызовы объектов-обёрток.
-
PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls) -
Возвращаемое значение: Новая ссылка. Часть Стабильной ABI с версии 3.9.
Преобразует ml в объект Python вызываемый. Вызывающий должен убедиться, что ml существует дольше, чем вызываемый. Обычно ml определяется как статическая переменная.
Параметр self будет передан в качестве аргумента self функции C в
ml->ml_methпри вызове. self может бытьNULL.Атрибут вызываемого объекта
__module__можно установить из переданного аргумента module. module должен быть строкой Python, которая будет использоваться в качестве имени модуля, в котором определена функция. Если недоступно, может быть установлено вNoneилиNULL.См. также
Параметр cls будет передан в качестве аргумента defining_class функции C. Должен быть установлен, если
METH_METHODустановлен наml->ml_flags.Добавлен в версии 3.9.
-
PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) -
Возвращаемое значение: Новая ссылка. Часть Стабильной ABI.
Эквивалентно
PyCMethod_New(ml, self, module, NULL).
-
PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self) -
Возвращаемое значение: Новая ссылка. Часть Стабильной ABI с версии 3.4.
Эквивалентно
PyCMethod_New(ml, self, NULL, NULL).
Доступ к атрибутам типов расширений
-
type PyMemberDef -
Часть Стабильной ABI (включая все члены).
Структура, описывающая атрибут типа, соответствующего члену C-структуры. При определении класса поместите массив из этих структур с нулевым завершением в слот
tp_members.Поля структуры в порядке:
-
const char *name -
Имя члена. Значение NULL отмечает конец массива
PyMemberDef[].Строка должна быть статической, её копия не создаётся.
-
int type -
Тип члена в C-структуре. Возможные значения см. в Типы членов.
-
Py_ssize_t offset -
Смещение в байтах, по которому расположен член в структуре объекта типа.
-
int flags -
Один или несколько флагов членов, объединённых с помощью побитового ИЛИ.
-
const char *doc -
Строка документации или NULL. Строка должна быть статической, её копия не создаётся. Обычно она определяется с помощью
PyDoc_STR.
По умолчанию (когда
flagsравен0), члены позволяют чтение и запись. Используйте флагPy_READONLYдля только чтения. Некоторые типы, такие какPy_T_STRING, подразумеваютPy_READONLY. Только члены типаPy_T_OBJECT_EX(и устаревшиеT_OBJECT) могут быть удалены.Для типов, выделенных на куче (созданных с помощью
PyType_FromSpec()или подобных функций),PyMemberDefможет содержать определение специального члена"__vectorcalloffset__", соответствующегоtp_vectorcall_offsetв объектах типа. Они должны быть определены с флагамиPy_T_PYSSIZETиPy_READONLY, например:static PyMemberDef spam_type_members[] = { {"__vectorcalloffset__", Py_T_PYSSIZET, offsetof(Spam_object, vectorcall), Py_READONLY}, {NULL} /* Sentinel */ };(Возможно, вам потребуется
#include <stddef.h>дляoffsetof().)Устаревшие смещения
tp_dictoffsetиtp_weaklistoffsetможно определить аналогичным образом с помощью"__dictoffset__"и"__weaklistoffset__"членов, но расширениям настоятельно рекомендуется использоватьPy_TPFLAGS_MANAGED_DICTиPy_TPFLAGS_MANAGED_WEAKREFвместо них.Изменено в версии 3.12:
PyMemberDefвсегда доступен. Раньше требовалось включение"structmember.h". -
-
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m) -
Часть Стабильной ABI.
Получить атрибут, принадлежащий объекту по адресу obj_addr. Атрибут описан в
PyMemberDefm. ВозвращаетNULLпри ошибке.Изменено в версии 3.12:
PyMember_GetOneвсегда доступен. Раньше требовалось включение"structmember.h".
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o) -
Часть Стабильной ABI.
Установить атрибут, принадлежащий объекту по адресу obj_addr, на объект o. Атрибут для установки описан в
PyMemberDefm. Возвращает0при успехе и отрицательное значение при ошибке.Изменено в версии 3.12:
PyMember_SetOneвсегда доступен. Раньше требовалось включение"structmember.h".
Флаги членов
Следующие флаги могут использоваться с PyMemberDef.flags:
-
Py_READONLY -
Не записываемый.
-
Py_AUDIT_READ -
Сгенерировать событие аудита аудита перед чтением.
-
Py_RELATIVE_OFFSET -
Указывает, что
offsetэтого элементаPyMemberDefявляется смещением от данных, специфичных для подкласса, а не отPyObject.Может использоваться только в качестве части
Py_tp_membersslotпри создании класса с отрицательнымbasicsize. В этом случае он обязателен.Этот флаг используется только в
PyType_Slot. При установкеtp_membersво время создания класса Python очищает его и устанавливаетPyMemberDef.offsetв смещение отPyObjectструктуры.
Изменено в версии 3.10: Макросы RESTRICTED, READ_RESTRICTED и WRITE_RESTRICTED, доступные с #include "structmember.h", устарели. READ_RESTRICTED и RESTRICTED эквивалентны Py_AUDIT_READ; WRITE_RESTRICTED ничего не делает.
Изменено в версии 3.12: Макрос READONLY был переименован в Py_READONLY. Макрос PY_AUDIT_READ был переименован с префиксом Py_. Новые имена всегда доступны. Раньше для них требовалось #include "structmember.h". Заголовок всё ещё доступен и предоставляет старые имена.
Типы членов
PyMemberDef.type может быть одним из следующих макросов, соответствующих различным типам C. При обращении к члену в Python он будет преобразован в эквивалентный тип Python. При установке из Python он будет преобразован обратно в тип C. Если это невозможно, будет поднято исключение, например, TypeError или ValueError.
За исключением отмеченных (D), атрибуты, определённые таким образом, не могут быть удалены с помощью, например, del или delattr().
Имя макроса | Тип C | Тип Python |
|---|---|---|
| char | |
| short | |
| int | |
| long | |
| long long | |
| unsigned char | |
| unsigned int | |
| unsigned short | |
| unsigned long | |
| unsigned long long | |
| ||
| float | |
| double | |
| char (записано как 0 или 1) | |
| const char* (*) |
|
| const char[] (*) |
|
| char (0-127) |
|
|
|
(*): Нуль-терминированная, кодированная в UTF-8 строка C. С Py_T_STRING представление C является указателем; с Py_T_STRING_INPLACE строка хранится непосредственно в структуре.
(**): Строка длиной 1. Принимается только ASCII.
(RO): Подразумевает Py_READONLY.
(D): Может быть удалена, в этом случае указатель устанавливается в NULL. Чтение указателя NULL вызывает AttributeError.
Добавлен в версии 3.12: В предыдущих версиях макросы были доступны только с #include "structmember.h" и именовались без префикса Py_ (например, как T_INT). Заголовок по-прежнему доступен и содержит старые имена, а также следующие устаревшие типы:
-
T_OBJECT -
Как
Py_T_OBJECT_EX, ноNULLпреобразуется вNone. Это приводит к неожиданному поведению в Python: удаление атрибута фактически устанавливает его вNone.
-
T_NONE -
Всегда
None. Должен использоваться сPy_READONLY.
Определение геттеров и сеттеров
-
type PyGetSetDef -
Часть Стабильной ABI (включая все члены).
Структура для определения доступа к свойствам типа. Также см. описание слота
PyTypeObject.tp_getset.-
const char *name -
Имя атрибута
-
getter get -
Функция C для получения атрибута.
-
setter set -
Необязательная функция C для установки или удаления атрибута. Если
NULL, атрибут является только для чтения.
-
const char *doc -
Необязательная строка документации
-
void *closure -
Необязательный указатель на пользовательские данные, предоставляющий дополнительные данные для геттера и сеттера.
-
-
typedef PyObject *(*getter)(PyObject*, void*) -
Часть Стабильной ABI.
Функция
getпринимает один параметр PyObject* (экземпляр) и указатель на пользовательские данные (ассоциированныйclosure):Она должна возвращать новую ссылку при успехе или
NULLс установленной ошибкой при неудаче.
-
typedef int (*setter)(PyObject*, PyObject*, void*) -
Часть Стабильной ABI.
Функции
setпринимают два параметра PyObject* (экземпляр и значение для установки) и указатель на пользовательские данные (ассоциированныйclosure):В случае удаления атрибута второй параметр является
NULL. Должно возвращать0при успехе или-1с установленной ошибкой при неудаче.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/structures.html