types — Создание динамического типа и имена для встроенных типов

Исходный код: Lib/types.py


Этот модуль определяет служебные функции для помощи в динамическом создании новых типов.

Он также определяет имена для некоторых типов объектов, которые используются стандартным интерпретатором Python, но не отображаются как встроенные функции, такие как int или str.

В завершение, он предоставляет некоторые дополнительные служебные классы и функции, относящиеся к типам, которые недостаточно фундаментальны для встроенных функций.

Динамическое создание типа

types.new_class(name, bases=(), kwds=None, exec_body=None)

Динамически создаёт объект класса с использованием соответствующего метакласса.

Первые три аргумента — это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), ключевые аргументы (например, metaclass).

Аргумент exec_body — это обратный вызов, который используется для заполнения только что созданного пространства имён класса. Он должен принять пространство имён класса в качестве единственного аргумента и обновить пространство имён напрямую с помощью содержимого класса. Если обратный вызов не предоставлен, то это эквивалентно передаче lambda ns: ns.

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

types.prepare_class(name, bases=(), kwds=None)

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

Аргументы — это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку) и ключевые аргументы (например, metaclass).

Возвращаемое значение — тройка: 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.FunctionType
types.LambdaType

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

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

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

types.GeneratorType

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

types.CoroutineType

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

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

types.AsyncGeneratorType

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

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

class types.CodeType(**kwargs)

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

Поднимает событие аудита 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

Тип bound методов некоторых встроенных типов данных и базовых классов. Например это тип object().__str__.

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

types.MethodDescriptorType

Тип методов некоторых встроенных типов данных, например str.join().

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

types.ClassMethodDescriptorType

Тип несвязанных методов класса некоторых встроенных типов данных, например dict.__dict__['fromkeys'].

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

class types.ModuleType(name, doc=None)

Типа модулей. Конструктор принимает имя создаваемого модуля и, возможно, его докстринг.

Примечание

Используйте importlib.util.module_from_spec() для создания нового модуля, если вы хотите установить различные атрибуты, управляемые импортом.

__doc__

Докстринг модуля. По умолчанию None.

__loader__

Загрузчик, который загрузил модуль. По умолчанию None.

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

__name__

Имя модуля.

__package__

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

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

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

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

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

types.FrameType

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

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

types.GetSetDescriptorType

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

types.MemberDescriptorType

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

Детали реализации CPython: В других реализациях Python этот тип может быть идентичен GetSetDescriptorType.

class types.MappingProxyType(mapping)

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

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

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

Возвращает новое представление значений базового сопоставления.

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

class types.SimpleNamespace

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

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

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

class SimpleNamespace:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        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.

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

Маршрутизатор доступа к атрибуту класса через __getattr__.

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

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

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

Служебные функции корутин

types.coroutine(gen_func)

Функция преобразует функцию генератор в функцию корутину, которая возвращает корутину основанную на генераторе. Основанная на генераторе корутина всё ещё является генераторным итератором, но также считается объектом корутиной и является awaitable. Однако она не обязательно может реализовать метод __await__().

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

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

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