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

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

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 и обобщённых типов

END_OF_DOCUMENT_MARKER

Типы стандартного интерпретатора

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

См. также

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

Подробная документация по экземплярам 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 является объектом трассировки.

END_OF_DOCUMENT_MARKER
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, который просто делегирует подлежащему отображению.

ключ in прокси

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

прокси[ключ]

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

iter(прокси)

Возвращает итератор по ключам базового отображения. Это сокращение для iter(proxy.keys()).

len(прокси)

Возвращает количество элементов в базовом отображении.

copy()

Возвращает поверхностную копию базового отображения.

get(key[, default])

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

items()

Возвращает новый вид элементов базового отображения ((key, value) пары).

keys()

Возвращает новый вид ключей базового отображения.

values()

Возвращает новый вид значений базового отображения.

reversed(прокси)

Возвращает обратный итератор по ключам базового отображения.

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

hash(прокси)

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

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

Spec-Zone.ru

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