Spec-Zone.ru › Python 3.13

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

Возвращаемое значение — кортеж из трёх элементов: 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.

types.get_original_bases(cls, /)

Возвращает кортеж объектов, изначально переданных в качестве базовых классов cls, до вызова метода __mro_entries__() для любых базовых классов (согласно механизмам, описанным в PEP 560). Это полезно для интроспекции обобщённых типов.

Для классов с атрибутом __orig_bases__ эта функция возвращает значение cls.__orig_bases__. Для классов без атрибута __orig_bases__ возвращается cls.__bases__.

Примеры:

from typing import TypeVar, Generic, NamedTuple, TypedDict

T = TypeVar("T")
class Foo(Generic[T]): ...
class Bar(Foo[int], float): ...
class Baz(list[str]): ...
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
Spam = TypedDict("Spam", {"a": int, "b": str})

assert Bar.__bases__ == (Foo, float)
assert get_original_bases(Bar) == (Foo[int], float)

assert Baz.__bases__ == (list,)
assert get_original_bases(Baz) == (list[str],)

assert Eggs.__bases__ == (tuple,)
assert get_original_bases(Eggs) == (NamedTuple,)

assert Spam.__bases__ == (dict,)
assert get_original_bases(Spam) == (TypedDict,)

assert int.__bases__ == (object,)
assert get_original_bases(int) == (object,)

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

См. также

PEP 560 — Базовая поддержка модуля typing и обобщённых типов

Стандартные типы интерпретатора

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

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

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

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

types.NoneType

Тип None.

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

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.

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

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

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

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

class types.ModuleType(name, doc=None)

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

См. также

Документация по объектам модулей

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

importlib.util.module_from_spec()

Модули, созданные с помощью конструктора ModuleType, создаются со многими неустановленными специальными атрибутами или атрибутами, имеющими значения по умолчанию. module_from_spec() предоставляет более надёжный способ создания экземпляров ModuleType, который обеспечивает правильную установку различных атрибутов.

types.EllipsisType

Тип Ellipsis.

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

class types.GenericAlias(t_origin, t_args)

Тип параметризованных обобщённых типов, таких как list[int].

t_origin должен быть непараметризованным обобщённым классом, например list, tuple или dict. t_args должен быть tuple (возможно, состоящим из одного элемента) типов, задающих параметры 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: Теперь этот тип можно наследовать.

См. также

Типы обобщённых псевдонимов

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

PEP 585 — Подсказки типов для обобщённых типов в стандартных коллекциях

Введение класса types.GenericAlias

class types.UnionType

Тип выражений объединения типов.

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

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

Тип объектов трассировки стека, например встречающихся в sys.exception().__traceback__.

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

types.FrameType

Тип объектов кадров, например встречающихся в 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: Добавлена поддержка нового оператора объединения (|) из PEP 584, который просто делегирует операцию базовому отображению.

key in proxy

Возвращает True, если в базовом отображении есть ключ key, и False в противном случае.

proxy[key]

Возвращает элемент базового отображения с ключом key. Если ключа key нет в базовом отображении, вызывает исключение KeyError.

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.

hash(proxy)

Возвращает хеш базового отображения.

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

class types.CapsuleType

Тип объектов-капсул.

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

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

class types.SimpleNamespace

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

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

Объекты SimpleNamespace можно инициализировать так же, как dict: именованными аргументами, одним позиционным аргументом или и тем и другим. При инициализации именованными аргументами они напрямую добавляются в базовое пространство имён. Если же передан позиционный аргумент, базовое пространство имён обновляется парами «ключ — значение» из этого аргумента (объекта отображения или итерируемого объекта, выдающего пары «ключ — значение»). Все такие ключи должны быть строками.

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

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

Объекты SimpleNamespace поддерживаются функцией copy.replace().

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

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

Изменено в версии 3.13: Добавлена поддержка необязательного позиционного аргумента.

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

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

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

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

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

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

types.coroutine(gen_func)

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

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

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

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

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/types.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API