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, kwdsmetaclass - соответствующий метакласс, namespace - подготовленное пространство имен класса, а kwds - обновленная копия переданного аргумента kwds с удаленными элементами
'metaclass'. Если аргумент kwds не передан, это будет пустой dict.Добавлено в версии 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 - Поддержка ядра для типизации модульных и общих типов
Стандартные типы интерпретаторов¶
Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают только случайно в процессе обработки, например, тип listiterator.
Обычно эти имена используются для проверок isinstance() или issubclass().
Если вы создаете любой из этих типов, обратите внимание, что сигнатуры могут отличаться в разных версиях Python.
Стандартные имена определены для следующих типов:
-
types.FunctionType¶ -
types.LambdaType¶ Тип определяемых пользователем функций и функций, создаваемых выражениями
lambda.Вызывает auditing event
function.__new__с аргументомcode.Событие аудита возникает только при прямом инстанцировании функциональных объектов и не возникает при обычной компиляции.
-
types.CoroutineType¶ Тип объектов coroutine, создаваемых функциями
async def.Добавлено в версии 3.5.
-
types.AsyncGeneratorType¶ Тип объектов asynchronous generator-итераторов, создаваемых функциями асинхронного генератора.
Добавлено в версии 3.6.
-
class
types.CodeType(**kwargs)¶ Тип для объектов кода, например, возвращаемых командой
compile().Поднимает auditing event
code.__new__с аргументамиcode,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags.Обратите внимание, что проверяемые аргументы могут не совпадать с именами или позициями, требуемыми инициализатором. Событие аудита возникает только при непосредственном инстанцировании объектов кода и не возникает при обычной компиляции.
-
replace(**kwargs)¶ Возвращает копию объекта кода с новыми значениями для указанных полей.
Добавлено в версии 3.8.
-
-
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¶ Тип методов класса unbound некоторых встроенных типов данных, таких как
dict.__dict__['fromkeys'].Добавлено в версии 3.7.
-
class
types.ModuleType(name, doc=None)¶ Тип modules. Конструктор принимает имя создаваемого модуля и опционально его docstring.
Примечание
Используйте
importlib.util.module_from_spec()для создания нового модуля, если вы хотите установить различные атрибуты, контролируемые импортом.-
__loader__¶ loader, который загрузил модуль. По умолчанию
None.Этот атрибут должен соответствовать
importlib.machinery.ModuleSpec.loader, хранящемуся в объекте attr:__spec__.Примечание
Будущая версия Python может перестать устанавливать этот атрибут по умолчанию. Чтобы защититься от этого потенциального изменения, предпочтительно читать из атрибута
__spec__вместо него или использоватьgetattr(module, "__loader__", None), если вам явно нужно использовать этот атрибут.Изменено в версии 3.4: По умолчанию имеет значение
None. Ранее атрибут был необязательным.
-
__name__¶ Имя модуля. Ожидается совпадение с
importlib.machinery.ModuleSpec.name.
-
__package__¶ К какому package пакету принадлежит модуль. Если модуль верхнего уровня (т.е. не является частью какого-либо конкретного пакета), то атрибут должен быть установлен в
'', иначе он должен быть установлен в имя пакета (которое может быть__name__, если модуль сам является пакетом). По умолчанию установлено значениеNone.Этот атрибут должен соответствовать
importlib.machinery.ModuleSpec.parent, хранящемуся в объекте attr:__spec__.Примечание
Будущая версия Python может перестать устанавливать этот атрибут по умолчанию. Чтобы защититься от этого потенциального изменения, предпочтительно читать из атрибута
__spec__вместо него или использоватьgetattr(module, "__package__", None), если вам явно нужно использовать этот атрибут.Изменено в версии 3.4: По умолчанию имеет значение
None. Ранее атрибут был необязательным.
-
__spec__¶ Запись состояния модуля, связанного с системой импорта. Ожидается, что это будет экземпляр
importlib.machinery.ModuleSpec.Добавлено в версии 3.4.
-
-
class
types.GenericAlias(t_origin, t_args)¶ Тип parameterized generics, например
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: Теперь этот тип может быть подклассом.
-
class
types.UnionType¶ -
Добавлено в версии 3.10.
-
class
types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)¶ Тип объектов обратного следа, например, найденных в
sys.exc_info()[2].Подробную информацию о доступных атрибутах и операциях, а также руководство по динамическому созданию трассировок см. в the language reference.
-
types.FrameType¶ Тип объектов фрейма, таких как найденные в
tb.tb_frame, еслиtbявляется объектом traceback.Подробную информацию о доступных атрибутах и операциях смотрите в the language reference.
-
types.GetSetDescriptorType¶ Тип объектов, определенных в модулях расширения с
PyGetSetDef, таких какFrameType.f_localsилиarray.array.typecode. Этот тип используется в качестве дескриптора для атрибутов объекта; он имеет то же назначение, что и типproperty, но для классов, определенных в модулях расширения.
-
types.MemberDescriptorType¶ Тип объектов, определенных в модулях расширения с помощью
PyMemberDef, таких какdatetime.timedelta.days. Этот тип используется в качестве дескриптора для простых членов данных языка Си, которые используют стандартные функции преобразования; он имеет то же назначение, что и типproperty, но для классов, определенных в модулях расширения.CPython implementation detail: В других реализациях Python этот тип может быть идентичен
GetSetDescriptorType.
-
class
types.MappingProxyType(mapping)¶ Прокси отображения отображения только для чтения. Он обеспечивает динамическое представление записей отображения, что означает, что когда отображение изменяется, представление отражает эти изменения.
Добавлено в версии 3.3.
Изменено в версии 3.9: Обновлено для поддержки нового оператора union (
|) из PEP 584, который просто делегирует базовое отображение.-
key in proxy Возвращает
True, если базовое отображение имеет ключ key, иначеFalse.
-
proxy[key] Возвращает элемент базового отображения с ключом key. Вызывает ошибку
KeyError, если key отсутствует в базовом отображении.
-
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, предоставляющий атрибутивный доступ к своему пространству имен, а также содержательный repr.В отличие от
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: Порядок атрибутов в repr изменился с алфавитного на вставной (как
dict).
-
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶ Перенаправьте доступ к атрибутам класса на __getattr__.
Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе к ним через экземпляр и через класс. Доступ к экземпляру остается обычным, но доступ к атрибуту через класс будет перенаправлен к методу __getattr__ класса; это делается путем возникновения AttributeError.
Это позволяет иметь свойства, активные для экземпляра, и виртуальные атрибуты для класса с тем же именем (см. пример
enum.Enum).Добавлено в версии 3.4.
Функции утилиты Coroutine¶
-
types.coroutine(gen_func)¶ Эта функция преобразует функцию generator в coroutine function, которая возвращает основанный на генераторе coroutine. Корутина на основе генератора по-прежнему является generator iterator, но также рассматривается как объект coroutine и является awaitable. Однако она может не обязательно реализовывать метод
__await__().Если gen_func является функцией генератора, она будет модифицирована на месте.
Если gen_func не является функцией генератора, она будет обернута. Если она возвращает экземпляр
collections.abc.Generator, то этот экземпляр будет обернут в прокси-объект awaitable. Все остальные типы объектов будут возвращены как есть.Добавлено в версии 3.5.