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.
Стандартные имена определены для следующих типов:
-
class types.NoneType -
Тип значения
None.Добавлено в версии 3.10.
-
class types.FunctionType -
class types.LambdaType -
Тип определяемых пользователем функций и функций, созданных
lambda-выражениями.Вызывает событие аудита
function.__new__с аргументомcode.Событие аудита возникает только при непосредственном создании объектов функций и не возникает при обычной компиляции.
-
class types.GeneratorType -
Тип объектов-итераторов генераторов, создаваемых функциями-генераторами.
-
class types.CoroutineType -
Тип объектов корутин, создаваемых функциями
async def.Добавлено в версии 3.5.
-
class types.AsyncGeneratorType -
Тип объектов-итераторов асинхронных генераторов, создаваемых асинхронными функциями-генераторами.
Добавлено в версии 3.6.
-
class types.CodeType(**kwargs) -
Тип объектов кода, например возвращаемых функцией
compile().Вызывает событие аудита
code.__new__с аргументамиcode,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags.Обратите внимание: проверяемые аргументы могут не соответствовать именам или позициям, требуемым инициализатором. Событие аудита возникает только при непосредственном создании объектов кода и не возникает при обычной компиляции.
-
class types.CellType -
Тип объектов ячеек: такие объекты используются в качестве контейнеров для переменных замыкания функции.
Добавлено в версии 3.8.
-
class types.MethodType -
Тип методов экземпляров определяемых пользователем классов.
-
class types.BuiltinFunctionType -
class types.BuiltinMethodType -
Тип встроенных функций, таких как
len()илиsys.exit(), а также методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)
-
class types.WrapperDescriptorType -
Тип методов некоторых встроенных типов данных и базовых классов, таких как
object.__init__()илиobject.__lt__().Добавлено в версии 3.7.
-
class types.MethodWrapperType -
Тип связанных методов некоторых встроенных типов данных и базовых классов. Например, это тип
object().__str__.Добавлено в версии 3.7.
-
class types.NotImplementedType -
Тип значения
NotImplemented.Добавлено в версии 3.10.
-
class types.MethodDescriptorType -
Тип методов некоторых встроенных типов данных, таких как
str.join().Добавлено в версии 3.7.
-
class 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.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.
Изменено в версии 3.14: Теперь это псевдоним для
typing.Union.
-
class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) -
Тип объектов трассировки стека, например содержащихся в
sys.exception().__traceback__.Сведения о доступных атрибутах и операциях, а также рекомендации по динамическому созданию трассировок стека см. в справочнике по языку.
-
class types.FrameType -
Тип объектов кадра, например содержащихся в
tb.tb_frame, еслиtbявляется объектом трассировки стека.
-
class types.GetSetDescriptorType -
Тип объектов, определенных в модулях расширений с помощью
PyGetSetDef, напримерFrameType.f_localsилиarray.array.typecode. Этот тип используется в качестве дескриптора атрибутов объектов; он выполняет ту же функцию, что и типproperty, но для классов, определенных в модулях расширений.
-
class types.MemberDescriptorType -
Тип объектов, определенных в модулях расширений с помощью
PyMemberDef, напримерdatetime.timedelta.days. Этот тип используется в качестве дескриптора простых элементов данных C, использующих стандартные функции преобразования; он выполняет ту же функцию, что и типproperty, но для классов, определенных в модулях расширений.Кроме того, если класс определен с атрибутом
__slots__, для каждого слота в качестве атрибута класса добавляется экземплярMemberDescriptorType. Это позволяет слоту отображаться в__dict__класса.Особенность реализации CPython: В других реализациях Python этот тип может быть идентичен
GetSetDescriptorType.
-
class types.MappingProxyType(mapping) -
Прокси-объект отображения, доступный только для чтения. Он предоставляет динамическое представление записей отображения: при изменении отображения это представление также обновляется.
MappingProxyTypes являются обобщенными по двум типам, обозначающим соответственно типы ключей и значений базового отображения.Добавлено в версии 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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/types.html