Spec-Zone.ru › Python 3.11

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.

См. также

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)

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

Примечание

Чтобы создать новый модуль и задать различные атрибуты, контролируемые механизмом импорта, используйте importlib.util.module_from_spec().

__doc__

Строка документации модуля. По умолчанию — None.

__loader__

Загрузчик, загрузивший модуль. По умолчанию — None.

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

Примечание

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

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

__name__

Имя модуля. Должно соответствовать importlib.machinery.ModuleSpec.name.

__package__

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

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

Примечание

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

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

__spec__

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

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

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.

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

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.11/library/types.html

Spec-Zone.ru

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