Содержание страницы
Объекты типов¶Type Objects
-
type PyTypeObject¶
- Часть Limited API (как непрозрачная структура).
C-структура объектов, используемая для описания встроенных типов.
-
PyTypeObject PyType_Type¶
- Часть Stable ABI.
Это объект типа для объектов-типов; он совпадает с объектом
typeна уровне Python.
-
int PyType_Check(PyObject *o)¶
Возвращает ненулевое значение, если объект o является объектом-типом, включая экземпляры типов, производных от стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.
-
int PyType_CheckExact(PyObject *o)¶
Возвращает ненулевое значение, если объект o является объектом-типом, но не подтипом стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.
-
unsigned int PyType_ClearCache()¶
- Часть Stable ABI.
Очищает внутренний кеш поиска. Возвращает текущий тег версии.
-
unsigned long PyType_GetFlags(PyTypeObject *type)¶
- Часть Stable 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)¶
- Часть Stable ABI.
Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.
-
int PyType_AddWatcher(PyType_WatchCallback 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, если_PyType_Lookup()не вызывается для type между изменениями; это деталь реализации и может измениться.)Расширение никогда не должно вызывать
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)¶
Возвращает истину, если объект типа поддерживает детектор циклов; это проверяет флаг типа
Py_TPFLAGS_HAVE_GC.
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)¶
- Часть Stable ABI.
Возвращает истину, если a является подтипом b.
Эта функция проверяет только непосредственные подтипы, то есть
__subclasscheck__()не вызывается для b. ВызовитеPyObject_IsSubclass(), чтобы выполнить ту же проверку, что иissubclass().
-
PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Универсальный обработчик для слота
tp_allocобъекта-типа. Использует стандартный механизм выделения памяти Python для создания нового экземпляра и инициализации всего его содержимого значениемNULL.
-
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Универсальный обработчик для слота
tp_newобъекта-типа. Создаёт новый экземпляр, используя слотtp_allocтипа.
-
int PyType_Ready(PyTypeObject *type)¶
- Часть Stable ABI.
Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает
0при успехе, или-1и устанавливает исключение при ошибке.Примечание
If some of the base classes implements the GC protocol and the provided type does not include the
Py_TPFLAGS_HAVE_GCin its flags, then the GC protocol will be automatically implemented from its parents. On the contrary, if the type being created does includePy_TPFLAGS_HAVE_GCin its flags then it must implement the GC protocol itself by at least implementing thetp_traversehandle.
-
PyObject *PyType_GetName(PyTypeObject *type)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.11.
Возвращает имя типа. Эквивалентно получению атрибута
__name__типа.Добавлено в версии 3.12.
-
PyObject *PyType_GetQualName(PyTypeObject *type)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.11.
Возвращает квалифицированное имя типа. Эквивалентно получению атрибута
__qualname__типа.Добавлено в версии 3.12.
-
PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)¶
- Часть Stable ABI, начиная с версии 3.13.
Возвращает полное квалифицированное имя типа. Эквивалентно
f"{type.__module__}.{type.__qualname__}"илиtype.__qualname__, еслиtype.__module__не является строкой или равно"builtins".Добавлено в версии 3.13.
-
PyObject *PyType_GetModuleName(PyTypeObject *type)¶
- Часть Stable ABI, начиная с версии 3.13.
Возвращает имя модуля типа. Эквивалентно получению атрибута
type.__module__.Добавлено в версии 3.13.
-
void *PyType_GetSlot(PyTypeObject *type, int slot)¶
- Часть Stable ABI начиная с версии 3.4.
Возвращает указатель на функцию, хранящийся в указанном слоте. Если результат равен
NULL, это означает, что либо слотNULL, либо функция была вызвана с недопустимыми параметрами. Обычно вызывающий код приводит указатель результата к соответствующему типу функции.См.
PyType_Slot.slotдля возможных значений аргумента slot.Добавлено в версии 3.4.
Изменено в версии 3.10:
PyType_GetSlot()теперь может принимать все типы. Ранее он был ограничен динамическими типами (heap types).
-
PyObject *PyType_GetModule(PyTypeObject *type)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI начиная с версии 3.10.
Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью
PyType_FromModuleAndSpec().Возвращаемая ссылка является заимствованной от type и будет действительна, пока существует ссылка на type. Не освобождайте её с помощью
Py_DECREF()или аналогичных средств.Если с данным типом не связан ни один модуль, устанавливает
TypeErrorи возвращаетNULL.Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание: в таком методе
PyType_GetModule(Py_TYPE(self))может не вернуть ожидаемый результат.Py_TYPE(self)может оказаться подклассом нужного класса, а подклассы необязательно определены в том же модуле, что и их суперкласс. См.PyCMethod, чтобы получить класс, определяющий метод. См.PyType_GetModuleByDef()для случаев, когдаPyCMethodнельзя использовать.Добавлено в версии 3.9.
-
void *PyType_GetModuleState(PyTypeObject *type)¶
- Часть Stable ABI начиная с версии 3.10.
Возвращает состояние объекта модуля, связанного с данным типом. Это сокращение для вызова
PyModule_GetState()для результатаPyType_GetModule().Если с данным типом не связан ни один модуль, устанавливает
TypeErrorи возвращаетNULL.Если с type связан модуль, но его состояние равно
NULL, возвращаетNULLбез установки исключения.Добавлено в версии 3.9.
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI начиная с версии 3.13.
Найти первый суперкласс, модуль которого был создан из заданного
PyModuleDefdef, и вернуть этот модуль.Если модуль не найден, возбуждает
TypeErrorи возвращаетNULL.Эта функция предназначена для использования совместно с
PyModule_GetState()для получения состояния модуля из слотовых методов (таких какtp_initилиnb_add) и других мест, где определяющий класс метода не может быть передан с помощью соглашения о вызовеPyCMethod.Возвращаемая ссылка является заимствованной от type и будет действительна, пока существует ссылка на type. Не освобождайте её с помощью
Py_DECREF()или аналогичных средств.Добавлено в версии 3.12.
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)¶
- Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.
Пытается назначить версионный тег заданному типу.
Возвращает 1, если тип уже имел допустимый версионный тег или был назначен новый, или 0, если новый тег не удалось назначить.
Добавлено в версии 3.12.
-
int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)¶
Возвращает true, если экземпляры type поддерживают создание слабых ссылок, и false в противном случае. Эта функция всегда завершается успешно. type не должен быть
NULL.См. также
Объекты слабых ссылокWeak Reference Objects
Создание типов, размещаемых в куче¶Creating Heap-Allocated Types
Следующие функции и структуры используются для создания динамических типов.
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- Часть Stable 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)¶
- Возвращаемое значение: новая ссылка. Часть Stable 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)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Эквивалентно
PyType_FromMetaclass(NULL, NULL, spec, NULL).Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, указанным в слотах Py_tp_base[s]. Ранее возвращались только экземпляры
type.tp_newметакласса игнорируется. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяетtp_new, устарело, и в Python 3.14+ оно будет запрещено.
-
type PyType_Spec¶
- Часть Stable ABI (включая все члены).
Структура, определяющая поведение типа.
-
const char *name¶
Имя типа, используемое для установки
PyTypeObject.tp_name.
-
int basicsize¶
Если положительное, задаёт размер экземпляра в байтах. Используется для установки
PyTypeObject.tp_basicsize.Если равно нулю, указывает, что
tp_basicsizeдолжен наследоваться.Если отрицательное, абсолютное значение указывает, сколько дополнительного места требуется экземплярам класса сверх суперкласса. Используйте
PyObject_GetTypeData()для получения указателя на память, зарезервированную таким образом для подкласса. Для отрицательногоbasicsizePython при необходимости вставляет выравнивание, чтобы удовлетворить требованиям выравнивания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}.Каждый идентификатор слота должен быть указан не более одного раза.
-
const char *name¶
-
type PyType_Slot¶
- Часть Stable ABI (включая все члены).
Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель на значение.
-
int slot¶
Идентификатор слота.
Идентификаторы слотов именуются подобно именам полей структур
PyTypeObject,PyNumberMethods,PySequenceMethods,PyMappingMethodsиPyAsyncMethodsс добавлением префиксаPy_. Например, используйте:Py_tp_deallocдля установкиPyTypeObject.tp_deallocPy_nb_addдля установкиPyNumberMethods.nb_addPy_sq_lengthдля установкиPySequenceMethods.sq_length
Следующие поля «offset» нельзя задать с помощью
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.
-
int slot¶