Spec-Zone.ru › Python 3.14

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

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

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

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

int PyType_Unwatch(int watcher_id, PyObject *type)

Помечает type как неотслеживаемый. Отменяет предшествующий вызов PyType_Watch(). type не должен быть NULL.

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

При успехе функция возвращает 0. При ошибке функция возвращает -1 и устанавливает исключение.

Добавлено в версии 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_FastSubclass(PyTypeObject *type, int flag)

Возвращает ненулевое значение, если объект типа type задаёт флаг подтипа flag. Флаги подтипов обозначаются с помощью Py_TPFLAGS_*_SUBCLASS. Эта функция используется многими функциями _Check для распространённых типов.

См. также

PyObject_TypeCheck(), которая используется как более медленная альтернатива в функциях _Check для типов, не имеющих флагов подтипов.

int PyType_IS_GC(PyTypeObject *o)

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

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

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

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

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

Обработчик общего назначения для слота tp_alloc объекта типа. Использует стандартный механизм выделения памяти Python для выделения памяти под новый экземпляр, обнуляет её, а затем инициализирует, как если бы был вызван PyObject_Init() или PyObject_InitVar().

Не вызывайте эту функцию напрямую для выделения памяти под объект; вместо этого вызовите слот tp_alloc типа.

Для типов, поддерживающих сборку мусора (то есть с установленным флагом Py_TPFLAGS_HAVE_GC), эта функция работает как PyObject_GC_New или PyObject_GC_NewVar (за исключением того, что память гарантированно обнуляется перед инициализацией), и её следует сочетать с PyObject_GC_Del() в tp_free. В противном случае она работает как PyObject_New или PyObject_NewVar (за исключением того, что память гарантированно обнуляется перед инициализацией), и её следует сочетать с PyObject_Free() в tp_free.

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.

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().

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

Если с указанным типом не связан ни один модуль, устанавливает 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 PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result)
Часть стабильного ABI начиная с версии 3.14.

Находит первый суперкласс в порядке разрешения методов типа type, у которого токен Py_tp_token совпадает с указанным.

  • Если суперкласс найден, присваивает *result новую сильную ссылку на него и возвращает 1.
  • Если суперкласс не найден, присваивает *result значение NULL и возвращает 0.
  • При ошибке присваивает *result значение NULL и возвращает -1, установив исключение.

Аргумент result может быть равен NULL; в этом случае значение *result не устанавливается. Используйте этот вариант, если вам нужно только возвращаемое значение.

Аргумент token не может быть равен NULL.

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

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

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

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

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

int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)

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

См. также

  • Объекты слабых ссылок
  • weakref

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

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

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.

Аргумент 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, признано устаревшим.

Изменено в версии 3.14: Создание классов, метакласс которых переопределяет tp_new, больше не разрешено.

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, признано устаревшим.

Изменено в версии 3.14: Создание классов, метакласс которых переопределяет tp_new, больше не разрешено.

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

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

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

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

Изменено в версии 3.14: Создание классов, метакласс которых переопределяет tp_new, больше не разрешено.

int PyType_Freeze(PyTypeObject *type)
Входит в стабильный ABI начиная с версии 3.14.

Делает тип неизменяемым: устанавливает флаг Py_TPFLAGS_IMMUTABLETYPE.

Все базовые классы type должны быть неизменяемыми.

В случае успеха возвращает 0. В случае ошибки устанавливает исключение и возвращает -1.

Тип нельзя использовать до того, как он станет неизменяемым. Например, до этого момента нельзя создавать экземпляры типа.

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

Поддерживается дополнительный слот, которому не соответствует поле структуры PyTypeObject:

  • Py_tp_token

Следующие поля «смещения» нельзя установить с помощью 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_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.

Изменено в версии 3.14: Теперь поле tp_vectorcall можно задать с помощью Py_tp_vectorcall. Подробности см. в документации к этому полю.

void *pfunc

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

Значения pfunc не могут быть равны NULL, за исключением следующих слотов:

  • Py_tp_doc
  • Py_tp_token (для ясности предпочтительнее использовать Py_TP_USE_SPEC, а не NULL)
Py_tp_token
Входит в стабильный ABI начиная с версии 3.14.

slot, который сохраняет идентификатор статической структуры памяти класса.

Если PyType_Spec класса размещён статически, токен можно задать равным спецификации, используя специальное значение Py_TP_USE_SPEC:

static PyType_Slot foo_slots[] = {
   {Py_tp_token, Py_TP_USE_SPEC},

Его также можно задать равным произвольному указателю, но необходимо обеспечить следующее:

  • Указатель должен существовать дольше класса, чтобы во время существования класса его не использовали повторно для чего-либо другого.
  • Указатель должен «принадлежать» модулю расширения, в котором находится класс, чтобы не конфликтовать с другими расширениями.

Используйте PyType_GetBaseByToken(), чтобы проверить, имеет ли суперкласс класса заданный токен, то есть совместима ли структура памяти.

Чтобы получить токен класса (не учитывая суперклассы), используйте PyType_GetSlot() с Py_tp_token.

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

Py_TP_USE_SPEC
Входит в стабильный ABI начиная с версии 3.14.

Используется как значение для Py_tp_token, чтобы задать токен равным PyType_Spec класса. Разворачивается в NULL.

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

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

Spec-Zone.ru

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