Общие структуры объектов
В определении типов объектов Python используется большое количество структур. В этом разделе описаны эти структуры и способы их использования.
Базовые типы объектов и макросы
Все объекты Python в конечном счёте имеют небольшое число общих полей в начале своего представления в памяти. Они представлены типами PyObject и PyVarObject, которые, в свою очередь, определяются раскрытием некоторых макросов, также используемых прямо или косвенно при определении всех остальных объектов Python. Дополнительные макросы можно найти в разделе подсчёт ссылок.
-
type PyObject -
Часть ограниченного API. (Только некоторые члены входят в стабильный ABI.)
Все типы объектов являются расширениями этого типа. Этот тип содержит информацию, необходимую Python, чтобы трактовать указатель на объект как объект. В обычной сборке «release» он содержит только счётчик ссылок объекта и указатель на соответствующий объект типа. Ничто фактически не объявлено как
PyObject, но любой указатель на объект Python можно привести к типу PyObject*. Доступ к членам необходимо осуществлять с помощью макросовPy_REFCNTиPy_TYPE.
-
type PyVarObject -
Часть ограниченного API. (Только некоторые члены входят в стабильный ABI.)
Это расширение типа
PyObject, добавляющее полеob_size. Оно используется только для объектов, имеющих понятие длины. Этот тип редко встречается в API Python/C. Доступ к членам необходимо осуществлять с помощью макросовPy_REFCNT,Py_TYPEиPy_SIZE.
-
PyObject_HEAD -
Этот макрос используется при объявлении новых типов, представляющих объекты с фиксированной длиной. Макрос PyObject_HEAD раскрывается в:
PyObject ob_base;
См. приведённую выше документацию по
PyObject.
-
PyObject_VAR_HEAD -
Этот макрос используется при объявлении новых типов, представляющих объекты, длина которых может различаться у разных экземпляров. Макрос PyObject_VAR_HEAD раскрывается в:
PyVarObject ob_base;
См. приведённую выше документацию по
PyVarObject.
-
PyTypeObject PyBaseObject_Type -
Часть стабильного ABI.
Базовый класс всех остальных объектов, соответствующий
objectв Python.
-
int Py_Is(PyObject *x, PyObject *y) -
Часть стабильного ABI начиная с версии 3.10.
Проверяет, является ли объект x тем же объектом, что и y; в Python этому соответствует
x is y.Добавлено в версии 3.10.
-
int Py_IsNone(PyObject *x) -
Часть стабильного ABI начиная с версии 3.10.
Проверяет, является ли объект одиночным экземпляром
None; в Python этому соответствуетx is None.Добавлено в версии 3.10.
-
int Py_IsTrue(PyObject *x) -
Часть стабильного ABI начиная с версии 3.10.
Проверяет, является ли объект одиночным экземпляром
True; в Python этому соответствуетx is True.Добавлено в версии 3.10.
-
int Py_IsFalse(PyObject *x) -
Часть стабильного ABI начиная с версии 3.10.
Проверяет, является ли объект одиночным экземпляром
False; в Python этому соответствуетx is False.Добавлено в версии 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 будет передан функции C в качестве аргумента defining_class. Его необходимо задать, если для
ml->ml_flagsустановлен флагMETH_METHOD.Добавлено в версии 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. При определении класса поместите массив этих структур, завершающийся NULL, в слот
tp_members.Её поля перечислены в следующем порядке:
-
const char *name -
Имя члена. Значение NULL отмечает конец массива
PyMemberDef[].Строка должна быть статической; её копия не создаётся.
-
int type -
Тип члена в структуре C. Возможные значения см. в разделе Типы членов.
-
Py_ssize_t offset -
Смещение в байтах, по которому находится член в структуре объекта типа.
-
int flags -
Ноль или более флагов членов, объединённых побитовой операцией OR.
-
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 -
Перед чтением генерирует
object.__getattr__событие аудита.
-
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) |
|
|
|
(*): Строка C с нулевым терминатором, закодированная в UTF-8. Для Py_T_STRING представление C — это указатель; для Py_T_STRING_INPLACE строка хранится непосредственно в структуре.
(**): Строка длиной 1. Допускаются только символы ASCII.
(только для чтения): подразумевает 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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/structures.html