Общие структуры объектов
Существует большое количество структур, которые используются в определении типов объектов для Python. В этом разделе описываются эти структуры и способы их использования.
Базовые типы объектов и макросы
Все объекты Python в конечном итоге имеют небольшое количество полей в начале представления объекта в памяти. Они представлены типами PyObject и PyVarObject, которые, в свою очередь, определяются с помощью макросов, также используемых, прямо или косвенно, при определении всех других объектов Python.
-
type PyObject -
Часть Ограниченного API. (Только некоторые члены являются частью стабильной ABI.)
Все типы объектов являются расширениями этого типа. Это тип, содержащий информацию, необходимую Python для обработки указателя на объект как на объект. В обычном «релизном» билде он содержит только счетчик ссылок объекта и указатель на соответствующий объект типа. Ничего фактически не объявляется как
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выше.
-
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_REFCNT(PyObject *o) -
Получение счетчика ссылок объекта Python o.
Используйте функцию
Py_SET_REFCNT()для установки счетчика ссылок объекта.Изменено в версии 3.11: Тип параметра больше не const PyObject*.
Изменено в версии 3.10:
Py_REFCNT()изменена на встроенную статическую функцию.
-
void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) -
Установка счетчика ссылок объекта o на значение refcnt.
Добавлена в версии 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. Аргументы ключевого слова передаются так же, как в протоколе векторного вызова: есть дополнительный четвертый параметр 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 будет загружен вместо объекта-обёртки и будет сосуществовать со слотом. Это полезно, так как вызовы PyCFunctions оптимизированы больше, чем вызовы объектов-обёрток.
Доступ к атрибутам типов расширения
-
type PyMemberDef -
Часть Стабильной ABI (включая все члены).
Структура, описывающая атрибут типа, соответствующий члену C-структуры. Ее поля:
Поле
C тип
Значение
nameconst char *
имя члена
typeint
тип члена в C-структуре
offsetPy_ssize_t
смещение в байтах, где расположен член в структуре объекта типа
flagsint
флаги, указывающие, является ли поле только для чтения или для записи
docconst char *
указатель на содержимое строкового описания
typeможет быть одним из многихT_макросов, соответствующих различным C-типам. При доступе к члену в Python он будет преобразован в эквивалентный тип Python.Имя макроса
C-тип
T_SHORT
short
T_INT
int
T_LONG
long
T_FLOAT
float
T_DOUBLE
double
T_STRING
const char *
T_OBJECT
PyObject *
T_OBJECT_EX
PyObject *
T_CHAR
char
T_BYTE
char
T_UBYTE
unsigned char
T_UINT
unsigned int
T_USHORT
unsigned short
T_ULONG
unsigned long
T_BOOL
char
T_LONGLONG
long long
T_ULONGLONG
unsigned long long
T_PYSSIZET
Py_ssize_t
T_OBJECTиT_OBJECT_EXразличаются тем, чтоT_OBJECTвозвращаетNoneесли членNULLиT_OBJECT_EXвызываетAttributeError. Постарайтесь использоватьT_OBJECT_EXвместоT_OBJECT, потому чтоT_OBJECT_EXобрабатывает использование оператораdelдля этого атрибута более правильно, чемT_OBJECT.flagsможет быть0для чтения и записи илиREADONLYдля только чтения. ИспользованиеT_STRINGдляtypeподразумеваетREADONLY. ДанныеT_STRINGинтерпретируются как UTF-8. Только членыT_OBJECTиT_OBJECT_EXмогут быть удалены. (Они установлены вNULL).Для типов, выделенных в куче (созданных с помощью
PyType_FromSpec()или аналогично),PyMemberDefмогут содержать определения для специальных членов__dictoffset__,__weaklistoffset__и__vectorcalloffset__, соответствующиеtp_dictoffset,tp_weaklistoffsetиtp_vectorcall_offsetв объектах типа. Они должны быть определены сT_PYSSIZETиREADONLY, например:static PyMemberDef spam_type_members[] = { {"__dictoffset__", T_PYSSIZET, offsetof(Spam_object, dict), READONLY}, {NULL} /* Sentinel */ };
-
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m) -
Получить атрибут, принадлежащий объекту по адресу obj_addr. Атрибут описывается
PyMemberDefm. ВозвращаетNULLпри ошибке.
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o) -
Установить атрибут, принадлежащий объекту по адресу obj_addr, на объект o. Атрибут для установки описывается
PyMemberDefm. Возвращает0при успехе и отрицательное значение при неудаче.
-
type PyGetSetDef -
Часть Стабильной ABI (включая все члены).
Структура для определения доступа к свойствам подобного типа. См. также описание слота
PyTypeObject.tp_getset.Поле
C тип
Значение
name
const char *
имя атрибута
get
getter
C-функция для получения атрибута
set
setter
необязательная C-функция для установки или удаления атрибута; если опущена, атрибут является только для чтения
doc
const char *
необязательное строковое описание
closure
void *
необязательный указатель на функцию, предоставляющий дополнительные данные для getter и setter
Функция
getпринимает один параметр PyObject* (экземпляр) и указатель на функцию (ассоциированныйclosure):typedef PyObject *(*getter)(PyObject *, void *);
Она должна вернуть новую ссылку при успехе или
NULLс установленным исключением при ошибке.Функции
setпринимают два параметра PyObject* (экземпляр и значение для установки) и указатель на функцию (ассоциированныйclosure):typedef int (*setter)(PyObject *, PyObject *, void *);
В случае удаления атрибута второй параметр
NULL. Должно вернуть0при успехе или-1с установленным исключением при ошибке.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/c-api/structures.html