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

Возвращаемое значение состоит из 3 кортежей: metaclass, namespace, kwds

metaclass - это соответствующий метакласс, namespace - это подготовленное пространство имен класса, а kwds - это обновленная копия переданного в kwds аргумента с удаленной любой записью 'metaclass'. Если аргумент kwds не передан, это будет пустой dict.

Добавлено в версии 3.3.

Изменено в версии 3.6: Значение по умолчанию для элемента namespace возвращаемого кортежа изменилось. Теперь сопоставление с сохранением порядка вставки используется, когда у метакласса нет метода __prepare__.

См.также

Метаклассы

Полная информация о процессе создания класса, поддерживаемом этими функциями

PEP 3115 - Метаклассы в Python 3000

Введен хук пространства имен __prepare__

types.resolve_bases(bases)

Динамически разрешать записи ТОИР, как указано в PEP 560.

Эта функция ищет элементы в базах, которые не являются экземплярами type, и возвращает кортеж, в котором каждый такой объект, имеющий метод __mro_entries__(), заменяется распакованным результатом вызова этого метода. Если элемент bases является экземпляром type или у него нет метода __mro_entries__(), то он включается в возвращаемый кортеж без изменений.

Добавлено в версии 3.7.

См.также

PEP 560 - Основная поддержка модуля ввода текста и универсальных типов

Стандартные типы переводчиков

Этот модуль предоставляет имена для многих типов, которые требуются для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают только случайно во время обработки, таких как тип listiterator.

Обычно эти имена используются для проверок isinstance() или issubclass().

Если вы создаете экземпляр любого из этих типов, обратите внимание, что сигнатуры могут отличаться в разных версиях Python.

Стандартные названия определены для следующих типов:

types.NoneType

Тип None.

Добавлено в версии 3.10.

types.FunctionType
types.LambdaType

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

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

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

types.GeneratorType

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

types.CoroutineType

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

Добавлено в версии 3.5.

types.AsyncGeneratorType

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

Добавлено в версии 3.6.

class types.CodeType(**kwargs)

Тип code objects, такой как возвращаемый compile().

Создает auditing event 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)

Тип 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.

Добавлено в версии 3.4.

types.EllipsisType

Тип Ellipsis.

Добавлено в версии 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

Добавлено в версии 3.9.

Изменено в версии 3.9.2: Теперь этот тип можно разделить на подклассы.

См.также

Generic Alias Types

Подробная документация по экземплярам types.GenericAlias

PEP 585 - Введите Общие Подсказки В Стандартных Коллекциях

Представляем класс types.GenericAlias

class types.UnionType

Тип union type expressions.

Добавлено в версии 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)

Доступный только для чтения прокси-сервер отображения. Он обеспечивает динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.

Добавлено в версии 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)

Возвращает обратный итератор по ключам базового отображения.

Добавлено в версии 3.9.

Дополнительные классы полезности и функции

class types.SimpleNamespace

Простой object подкласс, который предоставляет атрибутивный доступ к своему пространству имен, а также осмысленное представление.

В отличие от object, с помощью SimpleNamespace вы можете добавлять и удалять атрибуты. Если объект SimpleNamespace инициализируется аргументами ключевого слова, они непосредственно добавляются в базовое пространство имен.

Этот тип примерно эквивалентен следующему коду:

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        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().

Добавлено в версии 3.3.

Изменено в версии 3.9: Порядок атрибутов в repr изменен с алфавитного на порядок вставки (например, dict).

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)

Перенаправьте доступ к атрибуту класса на __getattr__.

Это дескриптор, используемый для определения атрибутов, которые действуют по-разному при доступе через экземпляр и через класс. Доступ к экземпляру остается обычным, но доступ к атрибуту через класс будет перенаправлен к методу класса __getattr__; это делается путем вызова AttributeError.

Это позволяет активировать свойства в экземпляре и использовать виртуальные атрибуты в классе с тем же именем (пример смотрите в enum.Enum).

Добавлено в версии 3.4.

Вспомогательные функции сопрограммы

types.coroutine(gen_func)

Эта функция преобразует функцию generator в функцию coroutine function, которая возвращает сопрограмму на основе генератора. Основанная на генераторе сопрограмма по-прежнему является generator iterator, но также считается объектом coroutine и является awaitable. Однако она может не обязательно реализовывать метод __await__().

Если gen_func является функцией генератора, она будет изменена на месте.

Если gen_func не является функцией-генератором, она будет преобразована. Если она возвращает экземпляр collections.abc.Generator, этот экземпляр будет преобразован в ожидаемый прокси-объект. Все остальные типы объектов будут возвращены как есть.

Добавлено в версии 3.5.

Вернуться на верх