Общие структуры объектов
В определении типов объектов 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. Оно используется только для объектов, имеющих понятие длины. Этот тип нечасто встречается в 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 -
Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой
METH_FASTCALL. Сигнатура функции:PyObject *_PyCFunctionFast(PyObject *self, PyObject *const *args, Py_ssize_t nargs);
-
type _PyCFunctionFastWithKeywords -
Тип функций, используемых для реализации вызываемых объектов 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, но после аргументаselfдобавляется аргументdefining_class.Добавлено в версии 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 callable. Вызывающий код должен обеспечить, чтобы ml существовал дольше, чем вызываемый объект callable. Обычно ml определяется как статическая переменная.
При вызове параметр self будет передан как аргумент self функции C в
ml->ml_meth. Значение self может бытьNULL.Атрибут
__module__вызываемого объекта callable можно задать с помощью переданного аргумента 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.
(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.12/c-api/structures.html