types — Динамическое создание типов и имена встроенных типов
Исходный код: Lib/types.py
Этот модуль определяет вспомогательные функции для динамического создания новых типов.
Он также определяет имена некоторых типов объектов, используемых стандартным интерпретатором Python, но не представленных в виде встроенных объектов, таких как int или str.
Наконец, в нём представлены дополнительные вспомогательные классы и функции, связанные с типами, которые недостаточно фундаментальны, чтобы быть встроенными.
Динамическое создание типов
-
types.new_class(name, bases=(), kwds=None, exec_body=None) -
Динамически создаёт объект класса, используя соответствующий метакласс.
Первые три аргумента — компоненты заголовка определения класса: имя класса, базовые классы (в заданном порядке) и именованные аргументы (например,
metaclass).Аргумент exec_body — это функция обратного вызова, используемая для заполнения пространства имён только что созданного класса. Она должна принимать пространство имён класса как единственный аргумент и непосредственно добавлять в него содержимое класса. Если функция обратного вызова не указана, эффект будет таким же, как при передаче
lambda ns: None.Добавлено в версии 3.3.
-
types.prepare_class(name, bases=(), kwds=None) -
Вычисляет подходящий метакласс и создаёт пространство имён класса.
Аргументы — компоненты заголовка определения класса: имя класса, базовые классы (в заданном порядке) и именованные аргументы (например,
metaclass).Возвращаемое значение — кортеж из трёх элементов:
metaclass, namespace, kwdsmetaclass — подходящий метакласс, namespace — подготовленное пространство имён класса, а kwds — обновлённая копия переданного аргумента kwds, из которой удалена запись
'metaclass'. Если аргумент kwds не передан, это будет пустой словарь.Добавлено в версии 3.3.
Изменено в версии 3.6: Изменилось значение по умолчанию для элемента
namespaceвозвращаемого кортежа. Теперь используется отображение, сохраняющее порядок вставки, если у метакласса нет метода__prepare__.
См. также
- Метаклассы
-
Полное описание процесса создания класса, поддерживаемого этими функциями
- PEP 3115 — Метаклассы в Python 3000
-
Введён механизм перехвата пространства имён
__prepare__
-
types.resolve_bases(bases) -
Динамически разрешает записи MRO согласно PEP 560.
Эта функция ищет в bases элементы, которые не являются экземплярами
type, и возвращает кортеж, в котором каждый такой объект, имеющий метод__mro_entries__(), заменён распакованным результатом вызова этого метода. Если элемент bases является экземпляромtypeили у него нет метода__mro_entries__(), он включается в возвращаемый кортеж без изменений.Добавлено в версии 3.7.
-
types.get_original_bases(cls, /) -
Возвращает кортеж объектов, изначально переданных в качестве базовых классов cls, до вызова метода
__mro_entries__()для любых базовых классов (согласно механизмам, описанным в PEP 560). Это полезно для интроспекции обобщённых типов.Для классов с атрибутом
__orig_bases__эта функция возвращает значениеcls.__orig_bases__. Для классов без атрибута__orig_bases__возвращаетсяcls.__bases__.Примеры:
from typing import TypeVar, Generic, NamedTuple, TypedDict T = TypeVar("T") class Foo(Generic[T]): ... class Bar(Foo[int], float): ... class Baz(list[str]): ... Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) Spam = TypedDict("Spam", {"a": int, "b": str}) assert Bar.__bases__ == (Foo, float) assert get_original_bases(Bar) == (Foo[int], float) assert Baz.__bases__ == (list,) assert get_original_bases(Baz) == (list[str],) assert Eggs.__bases__ == (tuple,) assert get_original_bases(Eggs) == (NamedTuple,) assert Spam.__bases__ == (dict,) assert get_original_bases(Spam) == (TypedDict,) assert int.__bases__ == (object,) assert get_original_bases(int) == (object,)Добавлено в версии 3.12.
См. также
PEP 560 — Базовая поддержка модуля typing и обобщённых типов
Стандартные типы интерпретатора
Этот модуль предоставляет имена многих типов, необходимых для реализации интерпретатора Python. В нём намеренно не представлены некоторые типы, возникающие лишь попутно в ходе обработки, например тип listiterator.
Обычно эти имена используются для проверок с помощью isinstance() или issubclass().
Если вы создаёте экземпляр любого из этих типов, учтите, что сигнатуры могут различаться в разных версиях Python.
Стандартные имена определены для следующих типов:
-
types.NoneType -
Тип
None.Добавлено в версии 3.10.
-
types.FunctionType -
types.LambdaType -
Тип пользовательских функций и функций, созданных
lambda-выражениями.Вызывает событие аудита
function.__new__с аргументомcode.Событие аудита возникает только при непосредственном создании объектов функций и не вызывается при обычной компиляции.
-
types.GeneratorType -
Тип объектов-итераторов генераторов, создаваемых функциями-генераторами.
-
types.CoroutineType -
Тип объектов сопрограмм, создаваемых функциями
async def.Добавлено в версии 3.5.
-
types.AsyncGeneratorType -
Тип объектов-итераторов асинхронных генераторов, создаваемых функциями асинхронных генераторов.
Добавлено в версии 3.6.
-
class types.CodeType(**kwargs) -
Тип объектов кода, например возвращаемых функцией
compile().Вызывает событие аудита
code.__new__с аргументамиcode,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags.Учтите, что аргументы аудита могут не соответствовать именам или позициям, требуемым инициализатором. Событие аудита возникает только при непосредственном создании объектов кода и не вызывается при обычной компиляции.
-
types.CellType -
Тип объектов-ячеек: такие объекты используются в качестве контейнеров для переменных замыкания функции.
Добавлено в версии 3.8.
-
types.MethodType -
Тип методов экземпляров пользовательских классов.
-
types.BuiltinFunctionType -
types.BuiltinMethodType -
Тип встроенных функций, таких как
len()илиsys.exit(), а также методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)
-
types.WrapperDescriptorType -
Тип методов некоторых встроенных типов данных и базовых классов, таких как
object.__init__()илиobject.__lt__().Добавлено в версии 3.7.
-
types.MethodWrapperType -
Тип связанных методов некоторых встроенных типов данных и базовых классов. Например, к этому типу относится
object().__str__.Добавлено в версии 3.7.
-
types.NotImplementedType -
Тип
NotImplemented.Добавлено в версии 3.10.
-
types.MethodDescriptorType -
Тип методов некоторых встроенных типов данных, таких как
str.join().Добавлено в версии 3.7.
-
types.ClassMethodDescriptorType -
Тип несвязанных методов классов некоторых встроенных типов данных, например
dict.__dict__['fromkeys'].Добавлено в версии 3.7.
-
class types.ModuleType(name, doc=None) -
Тип модулей. Конструктор принимает имя создаваемого модуля и, при необходимости, его строку документации.
См. также
- Документация по объектам модулей
-
Содержит сведения о специальных атрибутах экземпляров
ModuleType. -
importlib.util.module_from_spec() -
Модули, созданные с помощью конструктора
ModuleType, создаются со многими неустановленными специальными атрибутами или атрибутами, имеющими значения по умолчанию.module_from_spec()предоставляет более надёжный способ создания экземпляровModuleType, который обеспечивает правильную установку различных атрибутов.
-
types.EllipsisType -
Тип
Ellipsis.Добавлено в версии 3.10.
-
class types.GenericAlias(t_origin, t_args) -
Тип параметризованных обобщённых типов, таких как
list[int].t_originдолжен быть непараметризованным обобщённым классом, напримерlist,tupleилиdict.t_argsдолжен бытьtuple(возможно, состоящим из одного элемента) типов, задающих параметрыt_origin:>>> from types import GenericAlias >>> list[int] == GenericAlias(list, (int,)) True >>> dict[str, int] == GenericAlias(dict, (str, int)) True
Добавлено в версии 3.9.
Изменено в версии 3.9.2: Теперь этот тип можно наследовать.
См. также
- Типы обобщённых псевдонимов
-
Подробная документация по экземплярам
types.GenericAlias - PEP 585 — Подсказки типов для обобщённых типов в стандартных коллекциях
-
Введение класса
types.GenericAlias
-
class types.UnionType -
Тип выражений объединения типов.
Добавлено в версии 3.10.
-
class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) -
Тип объектов трассировки стека, например встречающихся в
sys.exception().__traceback__.Сведения о доступных атрибутах и операциях, а также рекомендации по динамическому созданию трассировок стека см. в справочнике по языку.
-
types.FrameType -
Тип объектов кадров, например встречающихся в
tb.tb_frame, еслиtbявляется объектом трассировки стека.
-
types.GetSetDescriptorType -
Тип объектов, определённых в модулях расширения с помощью
PyGetSetDef, напримерFrameType.f_localsилиarray.array.typecode. Этот тип используется в качестве дескриптора атрибутов объекта; он выполняет ту же функцию, что и типproperty, но для классов, определённых в модулях расширения.
-
types.MemberDescriptorType -
Тип объектов, определённых в модулях расширения с помощью
PyMemberDef, напримерdatetime.timedelta.days. Этот тип используется в качестве дескриптора простых элементов данных C, для которых применяются стандартные функции преобразования; он выполняет ту же функцию, что и типproperty, но для классов, определённых в модулях расширения.Кроме того, если класс определён с атрибутом
__slots__, для каждого слота в качестве атрибута класса добавляется экземплярMemberDescriptorType. Благодаря этому слот отображается в__dict__класса.Особенность реализации CPython: В других реализациях Python этот тип может совпадать с
GetSetDescriptorType.
-
class types.MappingProxyType(mapping) -
Доступный только для чтения прокси-объект отображения. Он предоставляет динамическое представление записей отображения, то есть при изменении отображения это представление также обновляется.
Добавлено в версии 3.3.
Изменено в версии 3.9: Добавлена поддержка нового оператора объединения (
|) из PEP 584, который просто делегирует операцию базовому отображению.- key in proxy
-
Возвращает
True, если в базовом отображении есть ключ key, иFalseв противном случае.
- proxy[key]
-
Возвращает элемент базового отображения с ключом key. Если ключа key нет в базовом отображении, вызывает исключение
KeyError.
- iter(proxy)
-
Возвращает итератор по ключам базового отображения. Это сокращённая запись для
iter(proxy.keys()).
- len(proxy)
-
Возвращает количество элементов в базовом отображении.
-
copy() -
Возвращает поверхностную копию базового отображения.
-
get(key[, default]) -
Возвращает значение для key, если key есть в базовом отображении, и значение default в противном случае. Если default не указан, по умолчанию используется
None, поэтому этот метод никогда не вызывает исключениеKeyError.
-
items() -
Возвращает новое представление элементов базового отображения (пары
(key, value)).
-
keys() -
Возвращает новое представление ключей базового отображения.
-
values() -
Возвращает новое представление значений базового отображения.
- reversed(proxy)
-
Возвращает обратный итератор по ключам базового отображения.
Добавлено в версии 3.9.
- hash(proxy)
-
Возвращает хеш базового отображения.
Добавлено в версии 3.12.
-
class types.CapsuleType -
Тип объектов-капсул.
Добавлено в версии 3.13.
Дополнительные вспомогательные классы и функции
-
class types.SimpleNamespace -
Простой подкласс
object, предоставляющий доступ к пространству имён через атрибуты, а также содержательное строковое представление.В отличие от
object, с помощьюSimpleNamespaceможно добавлять и удалять атрибуты.Объекты
SimpleNamespaceможно инициализировать так же, какdict: именованными аргументами, одним позиционным аргументом или и тем и другим. При инициализации именованными аргументами они напрямую добавляются в базовое пространство имён. Если же передан позиционный аргумент, базовое пространство имён обновляется парами «ключ — значение» из этого аргумента (объекта отображения или итерируемого объекта, выдающего пары «ключ — значение»). Все такие ключи должны быть строками.Этот тип приблизительно эквивалентен следующему коду:
class SimpleNamespace: def __init__(self, mapping_or_iterable=(), /, **kwargs): self.__dict__.update(mapping_or_iterable) self.__dict__.update(kwargs) def __repr__(self): items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace): return self.__dict__ == other.__dict__ return NotImplementedSimpleNamespaceможет быть полезен в качестве заменыclass NS: pass. Однако для типа записи со структурой используйте вместо негоnamedtuple().Объекты
SimpleNamespaceподдерживаются функциейcopy.replace().Добавлено в версии 3.3.
Изменено в версии 3.9: Порядок атрибутов в строковом представлении изменился с алфавитного на порядок вставки (как у
dict).Изменено в версии 3.13: Добавлена поддержка необязательного позиционного аргумента.
-
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None) -
Перенаправляет обращение к атрибуту класса в __getattr__.
Это дескриптор, используемый для определения атрибутов, поведение которых различается при обращении через экземпляр и через класс. Доступ к атрибуту экземпляра работает как обычно, но обращение к атрибуту через класс перенаправляется в метод __getattr__ класса; для этого возбуждается исключение AttributeError.
Это позволяет использовать свойства экземпляра и виртуальные атрибуты класса с одинаковым именем (пример см. в
enum.Enum).Добавлено в версии 3.4.
Вспомогательные функции для сопрограмм
-
types.coroutine(gen_func) -
Эта функция преобразует функцию генератора в функцию сопрограммы, возвращающую сопрограмму на основе генератора. Такая сопрограмма по-прежнему является итератором-генератором, но также считается объектом сопрограммы и является ожидаемым объектом. Однако она не обязательно реализует метод
__await__().Если gen_func — функция-генератор, она изменяется на месте.
Если gen_func не является функцией-генератором, она оборачивается. Если она возвращает экземпляр
collections.abc.Generator, экземпляр оборачивается в прокси-объект, являющийся ожидаемым объектом. Объекты всех остальных типов возвращаются без изменений.Добавлено в версии 3.5.
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/types.html