Spec-Zone.ru › Python 3.12

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

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

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

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

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

int PyType_Check(PyObject *o)

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

int PyType_CheckExact(PyObject *o)

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

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

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

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

Возвращает член 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)
Часть Стабильного API.

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

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)
Часть Стабильного API.

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

См. PyType_Slot.slot для возможных значений аргумента slot.

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

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

PyObject *PyType_GetModule(PyTypeObject *type)
Часть Стабильного API начиная с версии 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)
Часть Стабильного API начиная с версии 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.

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.12/c-api/type.html

Spec-Zone.ru

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