Содержание страницы
types – Динамическое создание типов и имена для встроенных типов¶types – Dynamic type creation and names for built-in 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).Возвращаемое значение – 3-кортеж:
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 и обобщённых типов
Стандартные типы интерпретатора¶Standard Interpreter Types
Этот модуль предоставляет имена для многих типов, необходимых для
реализации интерпретатора Python. Он намеренно избегает включения некоторых
типов, которые возникают лишь попутно при обработке, таких как
тип listiterator.
Типичное использование этих имён – для проверок isinstance() или issubclass().
При создании экземпляров любого из этих типов учтите, что сигнатуры могут различаться в разных версиях Python.
Стандартные имена определены для следующих типов:
- 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.GenericAlias(t_origin, t_args)¶
Тип параметризованных дженериков, таких как
list[int].t_originдолжен быть непараметризованным обобщённым классом, таким какlist,tupleилиdict.t_argsдолжен бытьtuple(возможно, длины 1) из типов, которые параметризуют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)¶
Тип объектов traceback, таких как в
sys.exception().__traceback__.См. справочник по языку для получения подробной информации о доступных атрибутах и операциях, а также рекомендации по динамическому созданию трассировок.
- class types.FrameType¶
Тип объектов фреймов, таких как в
tb.tb_frame, еслиtbявляется объектом traceback.
- class types.FrameLocalsProxyType¶
Тип прокси-объектов локальных переменных фрейма, которые находятся в атрибуте
frame.f_locals.Добавлено в версии 3.15.
См. также
- class types.LazyImportType¶
Тип прокси-объектов ленивого импорта. Эти объекты создаются, когда модуль импортируется лениво, и служат заполнителями до момента фактического обращения к модулю. Этот тип можно использовать для программного обнаружения ленивых импортов.
Добавлено в версии 3.15.
См. также
- 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)¶
Прокси-объект отображения только для чтения. Он предоставляет динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.
MappingProxyTypeявляются обобщёнными по двум типам, обозначающим (соответственно) типы ключей и значений базового отображения.Добавлено в версии 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, который предоставляет доступ к атрибутам своего пространства имён, а также осмысленное строковое представление.В отличие от
object, с помощьюSimpleNamespaceможно добавлять и удалять атрибуты.Объекты
SimpleNamespaceможно инициализировать так же, какdict: с помощью именованных аргументов, с помощью одного позиционного аргумента или обоими способами. При инициализации именованными аргументами они напрямую добавляются в базовое пространство имён. При инициализации позиционным аргументом базовое пространство имён обновляется парами ключ-значение из этого аргумента (объекта отображения или объекта iterable, порождающего пары ключ-значение). Все такие ключи должны быть строками.Этот тип примерно эквивалентен следующему коду:
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 NotImplemented
SimpleNamespaceможет быть полезен в качестве замены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.
Вспомогательные функции корутин¶Coroutine Utility Functions
- types.coroutine(gen_func)¶
Эта функция преобразует функцию generator в корутинную функцию, которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является generator iterator, но также считается объектом корутины и является ожидаемым объектом. Однако она может не реализовывать метод
__await__().Если gen_func является функцией-генератором, она будет изменена на месте.
Если gen_func не является функцией-генератором, она будет обёрнута. Если она возвращает экземпляр
collections.abc.Generator, экземпляр будет обёрнут в прокси-объект, который является ожидаемым объектом. Все остальные типы объектов будут возвращены как есть.Добавлено в версии 3.5.