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)

Разрешайте записи MRO динамически, как указано в PEP 560.

Эта функция ищет в bases элементы, не являющиеся экземплярами 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)

Тип для объектов кода, например, возвращаемых командой compile().

Поднимает auditing event code.__new__ с аргументами code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags.

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

replace(**kwargs)

Возвращает копию объекта кода с новыми значениями для указанных полей.

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

types.CellType

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

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

Тип методов класса unbound некоторых встроенных типов данных, таких как 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, хранящемуся в объекте attr:__spec__.

Примечание

Будущая версия Python может перестать устанавливать этот атрибут по умолчанию. Чтобы защититься от этого потенциального изменения, предпочтительно читать из атрибута __spec__ вместо него или использовать getattr(module, "__loader__", None), если вам явно нужно использовать этот атрибут.

Изменено в версии 3.4: По умолчанию имеет значение None. Ранее атрибут был необязательным.

__name__

Имя модуля. Ожидается совпадение с importlib.machinery.ModuleSpec.name.

__package__

К какому package пакету принадлежит модуль. Если модуль верхнего уровня (т.е. не является частью какого-либо конкретного пакета), то атрибут должен быть установлен в '', иначе он должен быть установлен в имя пакета (которое может быть __name__, если модуль сам является пакетом). По умолчанию установлено значение None.

Этот атрибут должен соответствовать importlib.machinery.ModuleSpec.parent, хранящемуся в объекте attr:__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: Теперь этот тип может быть подклассом.

class types.UnionType

Тип union type expressions.

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

class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

Тип объектов обратного следа, например, найденных в sys.exc_info()[2].

Подробную информацию о доступных атрибутах и операциях, а также руководство по динамическому созданию трассировок см. в the language reference.

types.FrameType

Тип объектов фрейма, таких как найденные в tb.tb_frame, если tb является объектом traceback.

Подробную информацию о доступных атрибутах и операциях смотрите в the language reference.

types.GetSetDescriptorType

Тип объектов, определенных в модулях расширения с PyGetSetDef, таких как FrameType.f_locals или array.array.typecode. Этот тип используется в качестве дескриптора для атрибутов объекта; он имеет то же назначение, что и тип property, но для классов, определенных в модулях расширения.

types.MemberDescriptorType

Тип объектов, определенных в модулях расширения с помощью PyMemberDef, таких как datetime.timedelta.days. Этот тип используется в качестве дескриптора для простых членов данных языка Си, которые используют стандартные функции преобразования; он имеет то же назначение, что и тип property, но для классов, определенных в модулях расширения.

CPython implementation detail: В других реализациях 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, предоставляющий атрибутивный доступ к своему пространству имен, а также содержательный repr.

В отличие от 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.

Функции утилиты Coroutine

types.coroutine(gen_func)

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

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

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

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

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