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.NoneType

Тип None.

Added in version 3.10.

types.FunctionType
types.LambdaType

Тип функций, определяемых пользователем, и функций, создаваемых выражениями lambda.

Поднимает auditing event function.__new__ с аргументом code.

Событие аудита возникает только при непосредственном инстанцировании объектов функций и не возникает при обычной компиляции.

types.GeneratorType

Тип объектов generator-итераторов, создаваемых функциями-генераторами.

types.CoroutineType

Тип объектов coroutine, создаваемых функциями async def.

Added in version 3.5.

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() для создания нового модуля, если вы хотите установить различные атрибуты, контролируемые импортом.

__doc__

Значение docstring модуля. По умолчанию принимает значение None.

__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.

types.EllipsisType

Тип Ellipsis.

Added in version 3.10.

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

Тип union type expressions.

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.