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

Возвращает значение представляет собой 3-кортеж: metaclass, namespace, kwds

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

Добавлено в версии 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 выражениями.

Raises an auditing event function.__new__ with argument code.

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

types.GeneratorType

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

types.CoroutineType

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

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

types.AsyncGeneratorType

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

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

class types.CodeType(**kwargs)

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

Raises an auditing event code.__new__ with arguments 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

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

В отличие от 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__ класса; это выполняется путем создания AttribureError.

Позволяет иметь активные свойства в сущность и виртуальные атрибуты в классе с тем же именем (пример см. в разделе перечисление).

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

Служебные функции Coroutine

types.coroutine(gen_func)

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

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

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

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