Spec-Zone.ru › Python 3.12

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

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 и устанавливает исключение.

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

int PyType_ClearWatcher(int watcher_id)

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

Расширение никогда не должно вызывать 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)

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

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

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

Эта функция проверяет только фактические подтипы, то есть __subclasscheck__() для b не вызывается. Чтобы выполнить ту же проверку, что и 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 и устанавливает исключение.

Примечание

Если некоторые из базовых классов реализуют протокол сборщика мусора, а предоставленный тип не включает Py_TPFLAGS_HAVE_GC в свои флаги, протокол сборщика мусора будет автоматически реализован на основе родительских классов. Напротив, если создаваемый тип включает Py_TPFLAGS_HAVE_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.

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)

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

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

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

Добавлено в версии 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.

Создаёт и возвращает тип в куче на основе spec (см. 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(), чтобы получить указатель на зарезервированную таким образом память, предназначенную для подкласса.

Изменено в версии 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/c-api/type.html

Spec-Zone.ru

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