Spec-Zone.ru › Python 3.13

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

type PyTypeObject
Часть Ограниченного API (как неявная структура).

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

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

Это объект типа для объектов типов; он совпадает с объектом type на уровне Python.

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, если _PyType_Lookup() не вызывается для type между изменениями; это деталь реализации и может измениться).

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

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

См. PyType_Slot.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 для получения класса, который определяет метод. См. PyType_GetModuleByDef() для случаев, когда PyCMethod нельзя использовать.

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

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

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

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

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

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

END_OF_DOCUMENT_MARKER

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

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

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
Часть Стабильного API (включая все члены).

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

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
Часть Стабильного API (включая все члены).

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

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: Слоты в PyBufferProcs могут быть установлены в неограниченном API.

Изменено в версии 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.13/c-api/type.html

Spec-Zone.ru

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