Структуры общих объектов¶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, которые принимают именованные аргументы: они принимают три параметра
PyObject*и возвращают одно такое значение. См.PyCFunctionвыше для описания возвращаемого значения.
-
PyMethodDef¶ Структура, используемая для описания метода типа-расширения. Эта структура имеет четыре поля:
Поле Тип C Значение ml_namechar * имя метода ml_methPyCFunction указатель на реализацию на C ml_flagsint биты флагов, указывающие, как должен быть построен вызов ml_docchar * указывает на содержимое докстринга
ml_meth – это указатель на функцию C. Функции могут быть разных
типов, но они всегда возвращают PyObject*. Если функция не является
PyCFunction, компилятор потребует приведения в таблице методов.
Хотя PyCFunction определяет первый параметр как
PyObject*, обычно реализация метода использует конкретный тип C
объекта self.
Поле ml_flags является битовым полем, которое может содержать следующие флаги.
Отдельные флаги указывают либо на соглашение о вызове, либо на соглашение о привязке.
Из флагов соглашения о вызове можно комбинировать только METH_VARARGS и METH_KEYWORDS. Любой из флагов соглашения о вызове можно комбинировать с флагом привязки.
-
METH_VARARGS¶ Это типичное соглашение о вызове, где методы имеют тип
PyCFunction. Функция ожидает два значенияPyObject*. Первое – это объект self для методов; для функций модуля – это объект модуля. Второй параметр (часто называемый args) – это кортеж, представляющий все аргументы. Этот параметр обычно обрабатывается с помощьюPyArg_ParseTuple()илиPyArg_UnpackTuple().
-
METH_KEYWORDS¶ Методы с этими флагами должны быть типа
PyCFunctionWithKeywords. Функция ожидает три параметра: self, args и словарь всех именованных аргументов. Флаг должен быть объединён сMETH_VARARGS, а параметры обычно обрабатываются с помощьюPyArg_ParseTupleAndKeywords().
-
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 Значение namechar * имя члена typeint тип члена в C-структуре offsetPy_ssize_t смещение в байтах, по которому член расположен в объектной структуре типа flagsint биты флага, указывающие, должно ли поле быть только для чтения или доступным для записи docchar * указывает на содержимое докстринга typeможет быть одним из многих макросовT_, соответствующих различным C типам. При обращении к члену из Python он будет преобразован в эквивалентный тип Python.Имя макроса Тип C T_SHORT short T_INT int T_LONG long T_FLOAT float T_DOUBLE double T_STRING 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_OBJECTиT_OBJECT_EX. (Они устанавливаются в NULL).