Spec-Zone.ru › Python 3.13

Объекты типов

type PyTypeObject
Часть Ограниченного API (в виде непрозрачной структуры).

Структура C для объектов, используемых для описания встроенных типов.

PyTypeObject PyType_Type
Часть Стабильного ABI.

Это объект типа для объектов типов; на уровне Python это тот же объект, что и type.

int PyType_Check(PyObject *o)

Возвращает ненулевое значение, если объект o является объектом типа, включая экземпляры типов, производных от стандартного объекта типа. Во всех остальных случаях возвращает 0. Эта функция всегда выполняется успешно.

int PyType_CheckExact(PyObject *o)

Возвращает ненулевое значение, если объект o является объектом типа, но не подтипом стандартного объекта типа. Во всех остальных случаях возвращает 0. Эта функция всегда выполняется успешно.

unsigned int PyType_ClearCache()
Часть Стабильного ABI.

Очищает внутренний кэш поиска. Возвращает текущую метку версии.

unsigned long PyType_GetFlags(PyTypeObject *type)
Часть Стабильного ABI.

Возвращает член tp_flags объекта type. Эта функция предназначена главным образом для использования с Py_LIMITED_API; отдельные биты флагов гарантированно остаются стабильными в разных выпусках Python, но доступ к самому tp_flags не входит в ограниченный API.

Добавлена в версии 3.2.

Изменено в версии 3.4: Теперь тип возвращаемого значения — unsigned long, а не long.

PyObject *PyType_GetDict(PyTypeObject *type)

Возвращает внутреннее пространство имён объекта типа, которое в остальном доступно только через прокси только для чтения (cls.__dict__). Эта функция заменяет прямой доступ к tp_dict. Возвращённый словарь следует считать доступным только для чтения.

Эта функция предназначена для конкретных случаев встраивания и привязки языков, когда необходим прямой доступ к словарю, а косвенный доступ (например, через прокси или PyObject_GetAttr()) недостаточен.

При настройке собственных типов модули расширения должны по-прежнему использовать tp_dict напрямую или косвенно.

Добавлена в версии 3.12.

void PyType_Modified(PyTypeObject *type)
Часть Стабильного ABI.

Инвалидирует внутренний кэш поиска для типа и всех его подтипов. Эту функцию необходимо вызывать после любого ручного изменения атрибутов или базовых классов типа.

int PyType_AddWatcher(PyType_WatchCallback callback)

Регистрирует callback в качестве наблюдателя типа. Возвращает неотрицательный целочисленный идентификатор, который необходимо передавать в последующие вызовы PyType_Watch(). В случае ошибки (например, если больше нет доступных идентификаторов наблюдателей) возвращает -1 и устанавливает исключение.

В сборках без блокировки потоков функция PyType_AddWatcher() не является потокобезопасной, поэтому её следует вызывать при запуске (до создания первого потока).

Добавлена в версии 3.12.

int PyType_ClearWatcher(int watcher_id)

Очищает наблюдателя с идентификатором watcher_id (ранее возвращённым функцией PyType_AddWatcher()). В случае успеха возвращает 0, в случае ошибки (например, если watcher_id никогда не регистрировался) — -1.

Модуль расширения ни в коем случае не должен вызывать PyType_ClearWatcher с идентификатором watcher_id, который не был возвращён ему предыдущим вызовом PyType_AddWatcher().

Добавлена в версии 3.12.

int PyType_Watch(int watcher_id, PyObject *type)

Помечает type как наблюдаемый. Функция обратного вызова, назначенная идентификатору watcher_id функцией PyType_AddWatcher(), будет вызвана всякий раз, когда PyType_Modified() сообщает об изменении type. (Функция обратного вызова может быть вызвана только один раз для последовательности изменений type, если между изменениями для type не вызывается _PyType_Lookup(); это деталь реализации, которая может измениться.)

Модуль расширения ни в коем случае не должен вызывать PyType_Watch с идентификатором watcher_id, который не был возвращён ему предыдущим вызовом PyType_AddWatcher().

Добавлена в версии 3.12.

typedef int (*PyType_WatchCallback)(PyObject *type)

Тип функции обратного вызова наблюдателя типа.

Функция обратного вызова не должна изменять type или вызывать PyType_Modified() для type или любого типа в его MRO; нарушение этого правила может привести к бесконечной рекурсии.

Добавлена в версии 3.12.

int PyType_HasFeature(PyTypeObject *o, int feature)

Возвращает ненулевое значение, если объект типа o задаёт функцию feature. Функции типов обозначаются отдельными битовыми флагами.

int PyType_IS_GC(PyTypeObject *o)

Возвращает true, если объект типа поддерживает обнаружение циклических ссылок; проверяется флаг типа Py_TPFLAGS_HAVE_GC.

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
Часть Стабильного ABI.

Возвращает true, если a является подтипом b.

Эта функция проверяет только фактические подтипы, то есть для b не вызывается __subclasscheck__(). Чтобы выполнить ту же проверку, что и issubclass(), вызвала бы PyObject_IsSubclass().

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Возвращаемое значение: новая ссылка. Часть Стабильного ABI.

Универсальный обработчик слота tp_alloc объекта типа. Использует стандартный механизм выделения памяти Python для выделения нового экземпляра и инициализации всего его содержимого значением NULL.

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Возвращаемое значение: новая ссылка. Часть Стабильного ABI.

Универсальный обработчик слота tp_new объекта типа. Создаёт новый экземпляр с помощью слота tp_alloc типа.

int PyType_Ready(PyTypeObject *type)
Часть Стабильного ABI.

Завершает настройку объекта типа. Эту функцию следует вызывать для всех объектов типов, чтобы завершить их инициализацию. Функция отвечает за добавление унаследованных слотов из базового класса типа. В случае успеха возвращает 0; в случае ошибки возвращает -1 и устанавливает исключение.

Примечание

Если некоторые из базовых классов реализуют протокол GC, а в предоставленном типе в его флагах отсутствует Py_TPFLAGS_HAVE_GC, протокол GC будет автоматически унаследован от родительских классов. Напротив, если создаваемый тип содержит Py_TPFLAGS_HAVE_GC в своих флагах, он должен самостоятельно реализовать протокол GC, как минимум реализовав слот tp_traverse.

PyObject *PyType_GetName(PyTypeObject *type)
Возвращаемое значение: новая ссылка. Часть Стабильного ABI начиная с версии 3.11.

Возвращает имя типа. Эквивалентно получению атрибута __name__ типа.

Добавлена в версии 3.11.

PyObject *PyType_GetQualName(PyTypeObject *type)
Возвращаемое значение: новая ссылка. Часть Стабильного ABI начиная с версии 3.11.

Возвращает квалифицированное имя типа. Эквивалентно получению атрибута __qualname__ типа.

Добавлена в версии 3.11.

PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)
Часть Стабильного ABI начиная с версии 3.13.

Возвращает полное квалифицированное имя типа. Эквивалентно f"{type.__module__}.{type.__qualname__}" или type.__qualname__, если type.__module__ не является строкой или равно "builtins".

Добавлена в версии 3.13.

PyObject *PyType_GetModuleName(PyTypeObject *type)
Часть Стабильного ABI начиная с версии 3.13.

Возвращает имя модуля типа. Эквивалентно получению атрибута type.__module__.

Добавлена в версии 3.13.

void *PyType_GetSlot(PyTypeObject *type, int slot)
Часть Стабильного ABI начиная с версии 3.4.

Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен NULL, это означает, что либо слот равен NULL, либо функция была вызвана с недопустимыми параметрами. Вызывающие код обычно преобразует указатель результата к соответствующему типу функции.

Возможные значения аргумента slot см. в описании PyType_Slot.slot.

Добавлена в версии 3.4.

Изменено в версии 3.10: Теперь PyType_GetSlot() принимает все типы. Ранее функция была ограничена динамическими типами.

PyObject *PyType_GetModule(PyTypeObject *type)
Часть Стабильного ABI начиная с версии 3.10.

Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью PyType_FromModuleAndSpec().

Если с данным типом не связан модуль, устанавливает TypeError и возвращает NULL.

Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание, что в таком методе PyType_GetModule(Py_TYPE(self)) может вернуть не тот результат, который ожидается. Py_TYPE(self) может быть подклассом предполагаемого класса, а подклассы не обязательно определены в том же модуле, что и их суперкласс. Чтобы получить класс, в котором определён метод, см. PyCMethod. Случаи, когда нельзя использовать PyCMethod, описаны в PyType_GetModuleByDef().

Добавлена в версии 3.9.

void *PyType_GetModuleState(PyTypeObject *type)
Часть Стабильного ABI начиная с версии 3.10.

Возвращает состояние объекта модуля, связанного с данным типом. Это сокращённая форма вызова PyModule_GetState() для результата PyType_GetModule().

Если с данным типом не связан модуль, устанавливает TypeError и возвращает NULL.

Если с type связан модуль, но его состояние равно NULL, возвращает NULL, не устанавливая исключение.

Добавлена в версии 3.9.

PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
Возвращаемое значение: заимствованная ссылка. Часть Стабильного ABI начиная с версии 3.13.

Находит первый суперкласс, модуль которого был создан из заданного PyModuleDef def, и возвращает этот модуль.

Если модуль не найден, вызывает исключение TypeError и возвращает NULL.

Эта функция предназначена для совместного использования с PyModule_GetState() при получении состояния модуля из методов-слотов (таких как tp_init или nb_add) и в других местах, где класс, определяющий метод, нельзя передать с помощью соглашения о вызовах PyCMethod.

Возвращённая ссылка является заимствованной от type и остаётся действительной, пока у вас есть ссылка на type. Не освобождайте её с помощью Py_DECREF() или аналогичной функции.

Добавлена в версии 3.11.

int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)
Это нестабильный API. Он может изменяться без предупреждения в промежуточных выпусках.

Пытается назначить указанному типу метку версии.

Возвращает 1, если у типа уже была действительная метка версии или была назначена новая, и 0, если новую метку назначить не удалось.

Добавлена в версии 3.12.

Создание типов, размещаемых в куче

Для создания типов в куче используются следующие функции и структуры.

PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
Входит в стабильный ABI начиная с версии 3.12.

Создаёт и возвращает тип в куче на основе спецификации (см. Py_TPFLAGS_HEAPTYPE).

Для создания результирующего объекта типа используется метакласс metaclass. Если metaclass равен NULL, метакласс определяется на основе bases (или слотов Py_tp_base[s], если bases равен NULL; см. ниже).

Метаклассы, переопределяющие tp_new, не поддерживаются, кроме случая, когда tp_new равен NULL. (Для обратной совместимости другие функции PyType_From* допускают такие метаклассы. Они игнорируют tp_new, что может привести к неполной инициализации. Такое поведение считается устаревшим; начиная с Python 3.14 такие метаклассы не будут поддерживаться.)

Аргумент bases можно использовать для указания базовых классов; он может содержать один класс или кортеж классов. Если bases равен NULL, вместо него используется слот Py_tp_bases. Если и он равен NULL, вместо него используется слот Py_tp_base. Если и он равен NULL, новый тип наследуется от object.

Аргумент module можно использовать для указания модуля, в котором определён новый класс. Он должен быть объектом модуля или NULL. Если он не равен NULL, модуль связывается с новым типом, и позднее его можно получить с помощью PyType_GetModule(). Связанный модуль не наследуется подклассами; его необходимо указывать отдельно для каждого класса.

Эта функция вызывает PyType_Ready() для нового типа.

Обратите внимание: поведение этой функции не полностью совпадает с вызовом type() или использованием инструкции class. Если пользователь указал базовые типы или метаклассы, предпочтительнее вызывать type (или метакласс), а не функции PyType_From*. В частности:

  • __new__() не вызывается для нового класса (и должен быть установлен в type.__new__).
  • __init__() не вызывается для нового класса.
  • __init_subclass__() не вызывается ни для одного из базовых классов.
  • __set_name__() не вызывается для новых дескрипторов.

Добавлено в версии 3.12.

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
Возвращаемое значение: новая ссылка. Входит в стабильный ABI начиная с версии 3.10.

Эквивалентно PyType_FromMetaclass(NULL, module, spec, bases).

Добавлено в версии 3.9.

Изменено в версии 3.10: Теперь функция принимает в качестве аргумента bases один класс и NULL в качестве слота tp_doc.

Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры type.

Метод tp_new метакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяет tp_new, считается устаревшим; начиная с Python 3.14 оно будет запрещено.

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Возвращаемое значение: новая ссылка. Входит в стабильный ABI начиная с версии 3.3.

Эквивалентно PyType_FromMetaclass(NULL, NULL, spec, bases).

Добавлено в версии 3.3.

Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры type.

Метод tp_new метакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяет tp_new, считается устаревшим; начиная с Python 3.14 оно будет запрещено.

PyObject *PyType_FromSpec(PyType_Spec *spec)
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.

Эквивалентно PyType_FromMetaclass(NULL, NULL, spec, NULL).

Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, указанным в слотах Py_tp_base[s]. Ранее возвращались только экземпляры type.

Метод tp_new метакласса игнорируется, что может привести к неполной инициализации. Создание классов, метакласс которых переопределяет tp_new, считается устаревшим; начиная с Python 3.14 оно будет запрещено.

type PyType_Spec
Входит в стабильный ABI (включая все члены).

Структура, определяющая поведение типа.

const char *name

Имя типа, используемое для установки PyTypeObject.tp_name.

int basicsize

Если значение положительное, задаёт размер экземпляра в байтах. Используется для установки PyTypeObject.tp_basicsize.

Если значение равно нулю, указывает, что следует унаследовать tp_basicsize.

Если значение отрицательное, его абсолютное значение задаёт объём памяти, необходимый экземплярам класса сверх объёма, необходимого суперклассу. Используйте PyObject_GetTypeData(), чтобы получить указатель на зарезервированную таким образом память подкласса. При отрицательном значении basicsize Python при необходимости добавит выравнивающие байты, чтобы соблюсти требования к выравниванию tp_basicsize.

Изменено в версии 3.12: Ранее это поле не могло быть отрицательным.

int itemsize

Размер одного элемента типа переменного размера в байтах. Используется для установки PyTypeObject.tp_itemsize. Информацию об ограничениях см. в документации tp_itemsize.

Если значение равно нулю, наследуется tp_itemsize. Наследование от произвольных классов переменного размера опасно: некоторые типы используют фиксированное смещение для памяти переменного размера, которое может перекрыть память фиксированного размера, используемую подклассом. Чтобы предотвратить ошибки, наследование itemsize возможно только в следующих случаях:

  • Базовый класс не является типом переменного размера (его tp_itemsize).
  • Запрошенное значение PyType_Spec.basicsize положительное, что указывает на то, что структура памяти базового класса известна.
  • Запрошенное значение PyType_Spec.basicsize равно нулю, что указывает на то, что подкласс не обращается напрямую к памяти экземпляра.
  • При использовании флага Py_TPFLAGS_ITEMS_AT_END.
unsigned int flags

Флаги типа, используемые для установки PyTypeObject.tp_flags.

Если флаг Py_TPFLAGS_HEAPTYPE не установлен, функция PyType_FromSpecWithBases() устанавливает его автоматически.

PyType_Slot *slots

Массив структур PyType_Slot. Завершается специальным значением слота {0, NULL}.

Каждый идентификатор слота следует указывать не более одного раза.

type PyType_Slot
Входит в стабильный ABI (включая все члены).

Структура, определяющая дополнительные возможности типа; содержит идентификатор слота и указатель на значение.

int slot

Идентификатор слота.

Идентификаторы слотов имеют названия, соответствующие именам полей структур PyTypeObject, PyNumberMethods, PySequenceMethods, PyMappingMethods и PyAsyncMethods, с добавленным префиксом Py_. Например, используйте:

  • Py_tp_dealloc для установки PyTypeObject.tp_dealloc
  • Py_nb_add для установки PyNumberMethods.nb_add
  • Py_sq_length для установки PySequenceMethods.sq_length

Следующие поля «смещения» нельзя установить с помощью PyType_Slot:

  • tp_weaklistoffset (по возможности используйте вместо него Py_TPFLAGS_MANAGED_WEAKREF)
  • tp_dictoffset (по возможности используйте вместо него Py_TPFLAGS_MANAGED_DICT)
  • tp_vectorcall_offset (используйте "__vectorcalloffset__" в PyMemberDef)

Если перейти на флаг MANAGED невозможно (например, для vectorcall или для поддержки версий Python старше 3.12), укажите смещение в Py_tp_members. Подробности см. в документации PyMemberDef.

При создании типа в куче нельзя установить следующие поля:

  • tp_vectorcall (используйте tp_new и/или tp_init)
  • Внутренние поля: tp_dict, tp_mro, tp_cache, tp_subclasses и tp_weaklist.

Установка Py_tp_bases или Py_tp_base может вызвать проблемы на некоторых платформах. Во избежание проблем используйте вместо этого аргумент bases функции PyType_FromSpecWithBases().

Изменено в версии 3.9: В неограниченном API можно устанавливать слоты в PyBufferProcs.

Изменено в версии 3.11: bf_getbuffer и bf_releasebuffer теперь доступны в рамках ограниченного API.

void *pfunc

Требуемое значение слота. В большинстве случаев это указатель на функцию.

Слоты, отличные от Py_tp_doc, не могут иметь значение NULL.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/type.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API