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, kwdsmetaclass — подходящий метакласс, 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.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 NotImplementedSimpleNamespaceможет быть полезен в качестве замены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