Документация Python неофициальный перевод
Содержание страницы

types – Динамическое создание типов и имена для встроенных типовtypes – Dynamic type creation and names for built-in types

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


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

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

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

Динамическое создание типовDynamic Type Creation

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 не был передан, будет пустой словарь.

Новое в версии 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 – Базовая поддержка модуля typing и обобщённых типов

Стандартные типы интерпретатораStandard Interpreter Types

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

Тип связанных методов некоторых встроенных типов данных и базовых классов. Например, это тип 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.

Этот атрибут должен соответствовать importlib.machinery.ModuleSpec.loader в том виде, в котором он хранится в объекте attr:__spec__.

Примечание

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

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

__name__

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

__package__

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

Этот атрибут должен соответствовать importlib.machinery.ModuleSpec.parent в том виде, в котором он хранится в объекте attr:__spec__.

Примечание

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

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

__spec__

Запись состояния модуля, связанного с системой импорта. Должен быть экземпляром importlib.machinery.ModuleSpec.

Новое в версии 3.4.

class types.GenericAlias(t_origin, t_args)

Тип параметризованных дженериков, таких как 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.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

Тип объектов traceback, таких как в sys.exc_info()[2].

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

types.FrameType

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

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

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.

Изменено в версии 3.9: Обновлено для поддержки нового оператора объединения (|) из 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.

Дополнительные вспомогательные классы и функцииAdditional Utility Classes and Functions

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: Порядок атрибутов в строковом представлении изменён с алфавитного на порядок вставки (как в dict).

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

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

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

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

Новое в версии 3.4.

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

types.coroutine(gen_func)

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

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

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

Новое в версии 3.5.