Общие структуры объектов
Существует большое количество структур, используемых при определении типов объектов в 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 -
Тип функций, используемых для реализации вызываемых в 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с добавленным аргументом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.12/c-api/structures.html