Общие структуры объектов¶
Существует большое количество структур, которые используются при определении типов объектов в Python. В этом разделе описываются эти структуры и способы их использования.
Базовые типы объектов и макросы¶
Все объекты Python в конечном счете совместно используют небольшое количество полей в начале представления объекта в памяти. Они представлены типами PyObject
и PyVarObject
, которые, в свою очередь, определяются расширениями некоторых макросов, также используемых, прямо или косвенно, при определении всех других объектов Python.
-
type PyObject¶
- Part of the Ограниченный API. (Only some members are part of the stable ABI.)
Все типы объектов являются расширениями этого типа. Это тип, который содержит информацию, необходимую Python для обработки указателя на объект как объекта. В обычной сборке «release» он содержит только количество ссылок на объект и указатель на соответствующий тип object. На самом деле ничего не объявлено как a
PyObject
, но каждый указатель на объект Python может быть преобразован в a PyObject*. Доступ к элементам должен осуществляться с помощью макросовPy_REFCNT
иPy_TYPE
.
-
type PyVarObject¶
- Part of the Ограниченный API. (Only some members are part of the stable 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)¶
- Part of the Стабильный ABI since version 3.10.
Проверьте, является ли объект x объектом y, аналогично
x is y
в Python.Добавлено в версии 3.10.
-
int Py_IsNone(PyObject *x)¶
- Part of the Стабильный ABI since version 3.10.
Проверьте, является ли объект
None
синглтоном, таким же, какx is None
в Python.Добавлено в версии 3.10.
-
int Py_IsTrue(PyObject *x)¶
- Part of the Стабильный ABI since version 3.10.
Проверьте, является ли объект
True
синглтоном, таким же, какx is True
в Python.Добавлено в версии 3.10.
-
int Py_IsFalse(PyObject *x)¶
- Part of the Стабильный ABI since version 3.10.
Проверьте, является ли объект
False
синглтоном, таким же, какx is False
в Python.Добавлено в версии 3.10.
-
PyTypeObject *Py_TYPE(PyObject *o)¶
Получаем тип объекта Python o.
Возвращает значение borrowed reference.
Используйте функцию
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 значение 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¶
- Part of the Стабильный ABI.
Тип функций, используемых для реализации большинства вызываемых объектов Python в C. Функции этого типа принимают два параметра PyObject* и возвращают одно такое значение. Если возвращаемое значение равно
NULL
, то должно быть установлено исключение. Если неNULL
, возвращаемое значение интерпретируется как возвращаемое значение функции, представленное в Python. Функция должна возвращать новую ссылку.Сигнатура функции такова:
PyObject *PyCFunction(PyObject *self, PyObject *args);
-
type PyCFunctionWithKeywords¶
- Part of the Стабильный 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¶
- Part of the Стабильный ABI (including all members).
Структура, используемая для описания метода типа расширения. Эта структура состоит из четырех полей:
-
const char *ml_name¶
Название метода.
-
PyCFunction ml_meth¶
Указатель на реализацию на языке Си.
-
int ml_flags¶
Помечает биты, указывающие на то, как должен быть сконструирован вызов.
-
const char *ml_doc¶
Указывает на содержимое строки документации.
-
const char *ml_name¶
Символ ml_meth
является указателем на функцию языка Си. Функции могут быть разных типов, но они всегда возвращают значение PyObject*. Если функция не относится к классу PyCFunction
, компилятор потребует приведения в таблице методов. Несмотря на то, что PyCFunction
определяет первый параметр как PyObject*, обычно при реализации метода используется определенный тип C объекта self.
Поле ml_flags
- это битовое поле, которое может содержать следующие флаги. Отдельные флаги указывают либо на соглашение о вызове, либо на соглашение о привязке.
Существуют следующие соглашения о вызовах:
-
METH_VARARGS¶
Это типичное соглашение о вызове, в котором методы имеют тип
PyCFunction
. Функция ожидает два значения PyObject*. Первое из них - это объект self для методов; для модульных функций это объект module. Второй параметр (часто называемый 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
теперь является частью stable ABI.
- METH_FASTCALL | METH_KEYWORDS
Расширение
METH_FASTCALL
, поддерживающее также аргументы ключевых слов, с методами типа_PyCFunctionFastWithKeywords
. Аргументы ключевого слова передаются так же, как и в vectorcall protocol: существует дополнительный четвертый параметр 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¶
Методы с одним аргументом object могут быть перечислены с флагом
METH_O
вместо вызоваPyArg_ParseTuple()
с аргументом"O"
. Они имеют типPyCFunction
с параметром self и параметр PyObject*, представляющий единственный аргумент.
Эти две константы используются не для указания соглашения о вызове, а для привязки при использовании с методами классов. Они не могут использоваться для функций, определенных для модулей. Для любого данного метода может быть установлен не более одного из этих флагов.
-
METH_CLASS¶
Методу будет передан type object в качестве первого параметра, а не экземпляр типа. Это используется для создания методов класса, аналогично тому, что создается при использовании встроенной функции
classmethod()
.
-
METH_STATIC¶
Методу будет передаваться
NULL
в качестве первого параметра, а не экземпляра типа. Это используется для создания статических методов, аналогичных тем, которые создаются при использовании встроенной функцииstaticmethod()
.
Еще одна константа определяет, будет ли метод загружен вместо другого определения с таким же именем метода.
-
METH_COEXIST¶
Метод будет загружен вместо существующих определений. Без METH_COEXIST по умолчанию повторяющиеся определения пропускаются. Поскольку обертки слотов загружаются перед таблицей методов, например, наличие слота sq_contains сгенерировало бы обернутый метод с именем
__contains__()
и исключило бы загрузку соответствующей функции PyCFunction с таким же именем. При установленном флаге функция PyCFunction будет загружена вместо объекта-оболочки и будет сосуществовать со слотом. Это полезно, поскольку вызовы функций Pc оптимизированы в большей степени, чем вызовы объектов-оболочек.
-
PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI since version 3.9.
Превратите ml в объект Python callable. Вызывающий объект должен убедиться, что ml переживет callable. Как правило, ml определяется как статическая переменная.
Параметр self будет передан в качестве аргумента self функции C в
ml->ml_meth
при вызове. self может бытьNULL
.Атрибут callable объекта
__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)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI.
Эквивалентно
PyCMethod_New(ml, self, module, NULL)
.
-
PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)¶
- Возвращаемое значение: Новая ссылка. Part of the Стабильный ABI since version 3.4.
Эквивалентно
PyCMethod_New(ml, self, NULL, NULL)
.
Доступ к атрибутам типов расширений¶
-
type PyMemberDef¶
- Part of the Стабильный ABI (including all members).
Структура, описывающая атрибут типа, соответствующего элементу структуры языка Си. Ее полями являются:
Поле
Тип C
Значение
name
постоянный символ *
имя участника
type
инт
тип элемента в структуре C
offset
Py_ssize_t (Размер файла)
смещение в байтах, по которому элемент располагается в объектной структуре типа
flags
инт
биты флага, указывающие, должно ли поле быть доступно только для чтения или для записи
doc
постоянный символ *
указывает на содержимое строки документации
type
может быть одним из многихT_
макросов, соответствующих различным типам языка Си. При обращении к элементу в Python он будет преобразован в эквивалентный тип языка Python.Имя макроса
Тип C
T_ШОРТ
короткий
T_INT - ТОЧКА ОТСЧЕТА
инт
T_ДЛИННЫЙ
длинный
T_FLOAT (ПЛАВАЮЩИЙ)
плыть
T_ДВАБЛЬ
двойной
T_STRING (СТРОКА)
постоянный символ *
T_ОБЪЕКТ
PyObject (объект поиска) *
T_ОБЪЕКТ_EX
PyObject (объект поиска) *
T_CHAR (Т_ЧАР )
обуглить
T_БАЙТ
обуглить
Т_УБАЙТ
неподписанный символ
T_UINT (ВРЕМЯ )
неподписанный int
T_НАПАДЕНИЕ
короткий без знака
Т_УЛОНГ
неподписанный длинный
T_BOOL (Т_БУЛ )
обуглить
T_ДЛИННЫЙ
долго, долго
T_ДОЛГИЙ
неподписанный длинный длинный
Т_ПИССИЗЕТ
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. Атрибут описывается как
PyMemberDef
m. ВозвращаетNULL
при ошибке.
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)¶
Присвойте атрибуту, принадлежащему объекту по адресу obj_addr, значение object o. Устанавливаемый атрибут описывается как
PyMemberDef
m. Возвращает0
в случае успеха и отрицательное значение в случае неудачи.
-
type PyGetSetDef¶
- Part of the Стабильный ABI (including all members).
Структура, определяющая доступ к типу, подобному свойству. Смотрите также описание слота
PyTypeObject.tp_getset
.Поле
Тип C
Значение
имя
постоянный символ *
имя атрибута
получить
добытчик
Функция C для получения атрибута
набор
сеттер
необязательная функция C для установки или удаления атрибута, если она опущена, то атрибут доступен только для чтения
док
постоянный символ *
необязательная строка документации
закрытие
пустота *
дополнительный указатель пользовательских данных, предоставляющий дополнительные данные для получателя и установщика
Функция
get
принимает один параметр:c:expr:PyObject* (экземпляр) и указатель пользовательских данных (связанныйclosure
).:typedef PyObject *(*getter)(PyObject *, void *);
Он должен возвращать новую ссылку в случае успеха или
NULL
с установленным исключением в случае сбоя.set
функции принимают два параметра: c:expr:PyObject* (экземпляр и значение, которое необходимо установить) и указатель пользовательских данных (связанныйclosure
).:typedef int (*setter)(PyObject *, PyObject *, void *);
В случае, если атрибут должен быть удален, вторым параметром будет
NULL
. В случае успеха должно быть возвращено значение0
или-1
с установленным исключением в случае сбоя.