types
— Динамическое создание типов и имена для встроенных типов¶
Источник: Lib/types.py
Этот модуль определяет служебные функции для динамического создания новых типов.
Он также определяет имена для некоторых типов объектов, которые используются стандартным интерпретатором Python, но не представлены в виде встроенных модулей, как int
или str
.
Наконец, он предоставляет некоторые дополнительные классы и функции, связанные с типами, которые не являются достаточно фундаментальными, чтобы быть встроенными.
Создание динамических типов¶
- types.new_class(name, bases=(), kwds=None, exec_body=None)¶
Создает объект класса динамически, используя соответствующий метакласс.
Первые три аргумента - это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), аргументы в виде ключевых слов (например,
metaclass
).Аргумент exec_body - это обратный вызов, который используется для заполнения только что созданного пространства имен класса. Он должен принимать пространство имен класса в качестве единственного аргумента и обновлять пространство имен непосредственно содержимым класса. Если обратный вызов не указан, это будет иметь тот же эффект, что и передача
lambda ns: None
.Added in version 3.3.
- types.prepare_class(name, bases=(), kwds=None)¶
Вычисляет соответствующий метакласс и создает пространство имен класса.
Аргументы - это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку) и аргументы в виде ключевых слов (например,
metaclass
).Возвращаемое значение представляет собой 3 кортежа:
metaclass, namespace, kwds
metaclass - соответствующий метакласс, namespace - подготовленное пространство имен класса, а kwds - обновленная копия переданного аргумента kwds с удаленными элементами
'metaclass'
. Если аргумент kwds не передан, это будет пустой dict.Added in version 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__()
, то он включается в возвращаемый кортеж без изменений.Added in version 3.7.
- types.get_original_bases(cls, /)¶
Возвращает кортеж объектов, изначально заданных в качестве баз cls до того, как метод
__mro_entries__()
был вызван на любой базе (следуя механизмам, изложенным в PEP 560). Это полезно для интроспекции Generics.Для классов, имеющих атрибут
__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,)
Added in version 3.12.
См.также
PEP 560 - Поддержка ядра для типизации модульных и общих типов
Стандартные типы интерпретаторов¶
Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают лишь случайно в процессе обработки, например, типа listiterator
.
Обычно эти имена используются для обозначения чеков isinstance()
или issubclass()
.
Если вы инстанцируете любой из этих типов, обратите внимание, что сигнатуры могут отличаться в разных версиях Python.
Стандартные имена определены для следующих типов:
- types.FunctionType¶
- types.LambdaType¶
Тип функций, определяемых пользователем, и функций, создаваемых выражениями
lambda
.Поднимает auditing event
function.__new__
с аргументомcode
.Событие аудита возникает только при непосредственном инстанцировании объектов функций и не возникает при обычной компиляции.
- types.AsyncGeneratorType¶
Тип asynchronous generator-итераторных объектов, создаваемых асинхронными генераторными функциями.
Added in version 3.6.
- class types.CodeType(**kwargs)¶
Тип code objects, например, возвращаемый
compile()
.Поднимает auditing event
code.__new__
с аргументамиcode
,filename
,name
,argcount
,posonlyargcount
,kwonlyargcount
,nlocals
,stacksize
,flags
.Обратите внимание, что проверяемые аргументы могут не совпадать с именами или позициями, требуемыми инициализатором. Событие аудита возникает только при непосредственном инстанцировании объектов кода и не возникает при обычной компиляции.
- types.CellType¶
Тип для объектов ячеек: такие объекты используются в качестве контейнеров для свободных переменных функции.
Added in version 3.8.
- types.MethodType¶
Тип методов экземпляров пользовательских классов.
- types.BuiltinFunctionType¶
- types.BuiltinMethodType¶
Тип встроенных функций, таких как
len()
илиsys.exit()
, и методов встроенных классов. (Здесь термин «встроенный» означает «написанный на языке C»).
- types.WrapperDescriptorType¶
Тип методов некоторых встроенных типов данных и базовых классов, таких как
object.__init__()
илиobject.__lt__()
.Added in version 3.7.
- types.MethodWrapperType¶
Тип связанных методов некоторых встроенных типов данных и базовых классов. Например, это тип
object().__str__
.Added in version 3.7.
- types.NotImplementedType¶
Тип
NotImplemented
.Added in version 3.10.
- types.MethodDescriptorType¶
Тип методов некоторых встроенных типов данных, таких как
str.join()
.Added in version 3.7.
- types.ClassMethodDescriptorType¶
Тип методов класса unbound некоторых встроенных типов данных, таких как
dict.__dict__['fromkeys']
.Added in version 3.7.
- class types.ModuleType(name, doc=None)¶
Тип modules. Конструктор принимает имя создаваемого модуля и, опционально, его docstring.
Примечание
Используйте
importlib.util.module_from_spec()
для создания нового модуля, если вы хотите установить различные атрибуты, контролируемые импортом.- __loader__¶
Значение loader, которое загрузило модуль. По умолчанию
None
.Этот атрибут должен соответствовать
importlib.machinery.ModuleSpec.loader
, хранящемуся в объекте__spec__
.Примечание
Будущая версия Python может перестать устанавливать этот атрибут по умолчанию. Чтобы защититься от этого потенциального изменения, предпочтительно читать из атрибута
__spec__
или использоватьgetattr(module, "__loader__", None)
, если вам явно нужно использовать этот атрибут.Изменено в версии 3.4: По умолчанию принимает значение
None
. Ранее атрибут был необязательным.
- __name__¶
Имя модуля. Ожидается совпадение с
importlib.machinery.ModuleSpec.name
.
- __package__¶
К какому package принадлежит модуль. Если модуль верхнего уровня (т.е. не является частью какого-либо конкретного пакета), то атрибут должен быть установлен в
''
, в противном случае он должен быть установлен в имя пакета (которое может быть__name__
, если модуль сам является пакетом). По умолчанию установлено значениеNone
.Этот атрибут должен соответствовать
importlib.machinery.ModuleSpec.parent
, хранящемуся в объекте__spec__
.Примечание
Будущая версия Python может перестать устанавливать этот атрибут по умолчанию. Чтобы защититься от этого потенциального изменения, предпочтительно читать из атрибута
__spec__
или использоватьgetattr(module, "__package__", None)
, если вам явно нужно использовать этот атрибут.Изменено в версии 3.4: По умолчанию принимает значение
None
. Ранее атрибут был необязательным.
- __spec__¶
Запись состояния модуля, связанного с системой импорта. Ожидается, что это будет экземпляр
importlib.machinery.ModuleSpec
.Added in version 3.4.
- class types.GenericAlias(t_origin, t_args)¶
Тип parameterized generics, например
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
Added in version 3.9.
Изменено в версии 3.9.2: Теперь этот тип может быть подклассифицирован.
См.также
- Generic Alias Types
Подробная документация по экземплярам
types.GenericAlias
- PEP 585 - Подсказка типов в стандартных коллекциях
Представляем класс
types.GenericAlias
- class types.UnionType¶
-
Added in version 3.10.
- class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)¶
Тип объектов трассировки, например, найденных в
sys.exception().__traceback__
.Подробную информацию о доступных атрибутах и операциях, а также руководство по динамическому созданию трассировок см. в разделе the language reference.
- types.FrameType¶
Тип frame objects, например, найденный в
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)¶
Прокси-сервер отображения, доступный только для чтения. Он обеспечивает динамическое представление записей отображения, что означает, что когда отображение меняется, представление отражает эти изменения.
Added in version 3.3.
Изменено в версии 3.9: Обновлено для поддержки нового оператора union (
|
) из 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)
Возвращает обратный итератор по ключам базового отображения.
Added in version 3.9.
- hash(proxy)
Возвращает хэш базового отображения.
Added in version 3.12.
- class types.CapsuleType¶
Тип capsule objects.
Added in version 3.13.
Дополнительные полезные классы и функции¶
- class types.SimpleNamespace¶
Простой подкласс
object
, предоставляющий атрибутный доступ к своему пространству имен, а также содержательный repr.В отличие от
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()
.Added in version 3.3.
Изменено в версии 3.9: Порядок атрибутов в repr изменился с алфавитного на вставной (например,
dict
).Изменено в версии 3.13: Добавлена поддержка необязательного позиционного аргумента.
- types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶
Перенаправьте доступ к атрибутам класса на __getattr__.
Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при обращении к ним через экземпляр и через класс. Доступ к экземпляру остается обычным, но доступ к атрибуту через класс будет перенаправлен в метод __getattr__ класса; это делается с помощью поднятия ошибки AttributeError.
Это позволяет иметь свойства, активные для экземпляра, и виртуальные атрибуты для класса с тем же именем (см. пример
enum.Enum
).Added in version 3.4.
Утилитарные функции корутина¶
- types.coroutine(gen_func)¶
Эта функция преобразует функцию generator в coroutine function, которая возвращает корутину на основе генератора. Корутин на основе генератора по-прежнему является generator iterator, но также считается объектом coroutine и является awaitable. Однако он может не обязательно реализовывать метод
__await__()
.Если gen_func является функцией генератора, то она будет изменена на месте.
Если gen_func не является генераторной функцией, она будет обернута. Если она возвращает экземпляр
collections.abc.Generator
, то этот экземпляр будет обернут в прокси-объект awaitable. Все остальные типы объектов будут возвращены как есть.Added in version 3.5.