Структуры общих объектов¶Common Object Structures
При определении типов объектов Python используется большое количество структур. В данном разделе описываются эти структуры и принципы их использования.
Все объекты Python имеют в начале своего представления в памяти небольшое число общих полей. Эти поля описываются типами PyObject и PyVarObject, которые, в свою очередь, определяются через раскрытие некоторых макросов, используемых (прямо или косвенно) при определении всех остальных объектов Python.
-
PyObject¶ Все типы объектов являются расширениями этого типа. Это тип, который содержит информацию, необходимую Python для обработки указателя на объект как объекта. В обычной сборке «release» он содержит только счетчик ссылок объекта и указатель на соответствующий объект типа. Ничто на самом деле не объявляется как
PyObject, но любой указатель на объект Python может быть приведен кPyObject*. Доступ к членам должен осуществляться с помощью макросовPy_REFCNTиPy_TYPE.
-
PyVarObject¶ Это расширение
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выше.
-
Py_TYPE(o)¶ Этот макрос используется для доступа к полю
ob_typeобъекта Python. Он раскрывается в:(((PyObject*)(o))->ob_type)
-
Py_REFCNT(o)¶ Этот макрос используется для доступа к полю
ob_refcntобъекта Python. Он раскрывается в:(((PyObject*)(o))->ob_refcnt)
-
Py_SIZE(o)¶ Этот макрос используется для доступа к полю
ob_sizeобъекта Python. Он раскрывается в:(((PyVarObject*)(o))->ob_size)
-
PyObject_HEAD_INIT(type)¶ Это макрос, который раскрывается в значения инициализации для нового типа
PyObject. Этот макрос раскрывается в:_PyObject_EXTRA_INIT 1, type,
-
PyVarObject_HEAD_INIT(type, size)¶ Это макрос, который разворачивается в значения инициализации для нового типа
PyVarObject, включая полеob_size. Этот макрос разворачивается в:_PyObject_EXTRA_INIT 1, type, size,
-
PyCFunction¶ Тип функций, используемых для реализации большинства вызываемых объектов Python в C. Функции этого типа принимают два параметра
PyObject*и возвращают одно такое значение. Если возвращаемое значение равноNULL, должно быть установлено исключение. Если неNULL, возвращаемое значение интерпретируется как возвращаемое значение функции, как она представлена в Python. Функция должна возвращать новую ссылку.
-
PyCFunctionWithKeywords¶ Тип функций, используемых для реализации вызываемых объектов Python в C с сигнатурой
METH_VARARGS | METH_KEYWORDS.
-
_PyCFunctionFast¶ Тип функций, используемых для реализации вызываемых объектов Python в C с сигнатурой
METH_FASTCALL.
-
_PyCFunctionFastWithKeywords¶ Тип функций, используемых для реализации вызываемых объектов Python в C с сигнатурой
METH_FASTCALL | METH_KEYWORDS.
-
PyMethodDef¶ Структура, используемая для описания метода типа-расширения. Эта структура имеет четыре поля:
Поле
Тип C
Значение
ml_nameconst char *
имя метода
ml_methPyCFunction
указатель на реализацию на C
ml_flagsint
биты флагов, указывающие, как должен быть построен вызов
ml_docconst char *
указывает на содержимое докстринга
ml_meth – это указатель на функцию C. Функции могут быть разных
типов, но они всегда возвращают PyObject*. Если функция не является
PyCFunction, компилятор потребует приведения в таблице методов.
Хотя PyCFunction определяет первый параметр как
PyObject*, обычно реализация метода использует конкретный тип C
объекта self.
Поле ml_flags – это битовое поле, которое может содержать следующие флаги.
Отдельные флаги указывают либо соглашение о вызове, либо соглашение о связывании.
Существует четыре базовых соглашения о вызове для позиционных аргументов,
и два из них могут быть объединены с METH_KEYWORDS для поддержки также
именованных аргументов. Таким образом, всего имеется 6 соглашений о вызове:
-
METH_VARARGS¶ Это типичное соглашение о вызове, где методы имеют тип
PyCFunction. Функция ожидает два значенияPyObject*. Первое – это объект self для методов; для функций модуля – это объект модуля. Второй параметр (часто называемый args) – это кортеж, представляющий все аргументы. Этот параметр обычно обрабатывается с помощьюPyArg_ParseTuple()илиPyArg_UnpackTuple().
-
METH_VARARGS | METH_KEYWORDS Методы с этими флагами должны быть типа
PyCFunctionWithKeywords. Функция ожидает три параметра: self, args, kwargs, где kwargs – это словарь всех именованных аргументов илиNULL, если именованных аргументов нет. Параметры обычно обрабатываются с помощьюPyArg_ParseTupleAndKeywords().
-
METH_FASTCALL¶ Быстрое соглашение о вызове, поддерживающее только позиционные аргументы. Методы имеют тип
_PyCFunctionFast. Первый параметр – self, второй параметр – массив C из значенийPyObject*, указывающих аргументы, а третий параметр – количество аргументов (длина массива).Это не является частью ограниченного API.
Добавлено в версии 3.7.
-
METH_FASTCALL | METH_KEYWORDS Расширение
METH_FASTCALL, поддерживающее также именованные аргументы, с методами типа_PyCFunctionFastWithKeywords. Именованные аргументы передаются так же, как в протоколе vectorcall: добавляется четвёртый параметрPyObject*, который представляет собой кортеж с именами именованных аргументов или, возможно,NULL, если ключевых слов нет. Значения именованных аргументов хранятся в массиве args после позиционных аргументов.Это не является частью ограниченного API.
Добавлено в версии 3.7.
-
METH_NOARGS¶ Методы без параметров не должны проверять, переданы ли аргументы, если они перечислены с флагом
METH_NOARGS. Они должны быть типаPyCFunction. Первый параметр обычно называется self и будет содержать ссылку на модуль или экземпляр объекта. Во всех случаях второй параметр будетNULL.
-
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 оптимизированы лучше, чем вызовы объектов-обёрток.
-
PyMemberDef¶ Структура, описывающая атрибут типа, который соответствует члену 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).
-
PyGetSetDef¶ Структура для определения доступа по типу свойства для типа. См. также описание слота
PyTypeObject.tp_getset.Поле
Тип C
Значение
имя
const char *
имя атрибута
get
getter
C-функция для получения атрибута
множество
setter
необязательная C-функция для установки или удаления атрибута, если не указана, атрибут доступен только для чтения
doc
const char *
необязательная строка документации
closure
void *
необязательный указатель на функцию, предоставляющий дополнительные данные для геттера и сеттера
Функция
getпринимает один параметрPyObject*(экземпляр) и указатель на функцию (связанныйclosure):typedef PyObject *(*getter)(PyObject *, void *);
В случае успеха должна возвращать новую ссылку или
NULLс установленным исключением в случае неудачи.Функции
setпринимают два параметраPyObject*(экземпляр и устанавливаемое значение) и указатель на функцию (связанныйclosure):typedef int (*setter)(PyObject *, PyObject *, void *);
Если атрибут должен быть удален, второй параметр равен
NULL. В случае успеха должна возвращать0или-1с установленным исключением в случае неудачи.