Spec-Zone.ru › Python 3.12

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

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

types.coroutine(gen_func)

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

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

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

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

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

Spec-Zone.ru

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