types – Динамическое создание типов и имена встроенных типов
Исходный код: Lib/types.py
Этот модуль определяет вспомогательные функции для динамического создания новых типов.
Он также определяет имена для некоторых типов объектов, которые используются стандартным интерпретатором Python, но не представлены как встроенные функции, такие как int или str.
Наконец, он предоставляет некоторые дополнительные вспомогательные классы и функции, связанные с типами, которые недостаточно фундаментальны, чтобы быть встроенными.
Dynamic Type CreationДинамическое создание типов
- 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). Это полезно для интроспекции Generics.Для классов, имеющих атрибут
__orig_bases__, эта функция возвращает значениеcls.__orig_bases__. Для классов без атрибута__orig_bases__возвращаетсяcls.__bases__.Примеры:
pythonfrom 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 и обобщённых типов
Standard Interpreter TypesСтандартные типы интерпретатора
Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают лишь попутно при обработке, например, типа listiterator.
Обычно эти имена используются для проверок isinstance() или issubclass().
При создании экземпляров любого из этих типов следует учитывать, что сигнатуры могут различаться в разных версиях Python.
Для следующих типов определены стандартные имена:
- 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¶
Тип объектов ячеек (cell): такие объекты используются как контейнеры для переменных замыкания функции.
Добавлено в версии 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, гарантирующий, что все атрибуты будут установлены должным образом.
- class types.GenericAlias(t_origin, t_args)¶
Тип параметризованных обобщённых типов, таких как
list[int].t_originдолжен быть непараметризованным обобщённым классом, напримерlist,tupleилиdict.t_argsдолжен бытьtuple(возможно, длины 1) из типов, параметризующихt_origin:python>>> 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.
Изменено в версии 3.14: Теперь это псевдоним для
typing.Union.
- class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)¶
Тип объектов трассировки, например таких, как в
sys.exception().__traceback__.См. справочник по языку, где приведены подробные сведения о доступных атрибутах и операциях, а также указания по динамическому созданию объектов трассировки.
- types.FrameType¶
Тип объектов фреймов, таких как в
tb.tb_frame, еслиtbявляется объектом трассировки.
- types.FrameLocalsProxyType¶
Тип прокси-объектов локальных переменных фрейма, как на атрибуте
frame.f_locals.Добавлено в версии 3.15.
Смотрите также
- types.LazyImportType¶
Тип объектов-прокси для ленивого импорта. Эти объекты создаются при ленивом импорте модуля и служат заполнителями до тех пор, пока модуль не будет фактически запрошен. Этот тип можно использовать для программного обнаружения ленивых импортов.
Добавлено в версии 3.15.
Смотрите также
- 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. Вызывает
KeyError, если key отсутствует в базовом отображении.
- 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.
Additional Utility Classes and FunctionsДополнительные вспомогательные классы и функции
- class types.SimpleNamespace¶
Простой подкласс
object, предоставляющий доступ к атрибутам своего пространства имён, а также осмысленное представление (repr).В отличие от
object, с помощьюSimpleNamespaceможно добавлять и удалять атрибуты.Объекты
SimpleNamespaceмогут быть инициализированы так же, какdict: либо с помощью именованных аргументов, либо с одним позиционным аргументом, либо с обоими. При инициализации именованными аргументами они напрямую добавляются в базовое пространство имён. В качестве альтернативы, при инициализации позиционным аргументом базовое пространство имён обновляется парами ключ-значение из этого аргумента (которым может быть отображение или итерируемый объект, порождающий пары ключ-значение). Все такие ключи должны быть строками.Этот тип примерно эквивалентен следующему коду:
pythonclass 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: Порядок атрибутов в repr изменён с алфавитного на порядок вставки (как
dict).Изменено в версии 3.13: Добавлена поддержка необязательного позиционного аргумента.
- types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶
Перенаправляет доступ к атрибутам класса на __getattr__.
Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе через экземпляр и через класс. Доступ через экземпляр остаётся обычным, но доступ к атрибуту через класс будет перенаправлен на метод __getattr__ класса; это достигается возбуждением AttributeError.
Это позволяет иметь свойства, активные на экземпляре, и виртуальные атрибуты с тем же именем на классе (см. пример
enum.Enum).Добавлено в версии 3.4.
Coroutine Utility FunctionsВспомогательные функции для корутин
- types.coroutine(gen_func)¶
Эта функция преобразует функцию-генератор в корутинную функцию, которая возвращает корутину на основе генератора. Такая корутина по-прежнему является итератором генератора, но также считается объектом корутины и является ожидаемым объектом. Однако она может не реализовывать метод
__await__().Если gen_func является функцией-генератором, она будет изменена на месте.
Если gen_func не является функцией-генератором, она будет обёрнута. Если она возвращает экземпляр
collections.abc.Generator, этот экземпляр будет обёрнут в ожидаемый объект-прокси. Все остальные типы объектов возвращаются как есть.Добавлено в версии 3.5.