Spec-Zone.ru › Python 3.14

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.

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

class types.NoneType

Тип значения None.

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

class types.FunctionType
class types.LambdaType

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

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

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

class types.GeneratorType

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

class types.CoroutineType

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

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

class types.AsyncGeneratorType

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

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

class types.CodeType(**kwargs)

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

Вызывает событие аудита code.__new__ с аргументами code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags.

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

class types.CellType

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

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

class types.MethodType

Тип методов экземпляров определяемых пользователем классов.

class types.BuiltinFunctionType
class types.BuiltinMethodType

Тип встроенных функций, таких как len() или sys.exit(), а также методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)

class types.WrapperDescriptorType

Тип методов некоторых встроенных типов данных и базовых классов, таких как object.__init__() или object.__lt__().

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

class types.MethodWrapperType

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

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

class types.NotImplementedType

Тип значения NotImplemented.

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

class types.MethodDescriptorType

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

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

class types.ClassMethodDescriptorType

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

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

class types.ModuleType(name, doc=None)

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

См. также

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

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

importlib.util.module_from_spec()

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

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

Изменено в версии 3.14: Теперь это псевдоним для typing.Union.

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

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

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

class types.FrameType

Тип объектов кадра, например содержащихся в tb.tb_frame, если tb является объектом трассировки стека.

class types.GetSetDescriptorType

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

class types.MemberDescriptorType

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

Кроме того, если класс определен с атрибутом __slots__, для каждого слота в качестве атрибута класса добавляется экземпляр MemberDescriptorType. Это позволяет слоту отображаться в __dict__ класса.

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

class types.MappingProxyType(mapping)

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

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

Добавлено в версии 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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/types.html

Spec-Zone.ru

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