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 не передан, это будет пустой словарь.Добавлен в версии 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) -
Тип модулей. Конструктор принимает имя создаваемого модуля и необязательно его документную строку.
Примечание
Используйте
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(возможно, длиной 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: Этот тип теперь можно наследовать.
См. также
- Типы Generic Alias
-
Подробная документация по экземплярам
types.GenericAlias - PEP 585 - Type Hinting Generics In Standard Collections
-
Ввод класса
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. Вызывает исключение
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.
- 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) -
Эта функция преобразует функцию-генератор в функцию-корутину, которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является итератором генератора, но также считается объектом корутины и является awaitable. Однако она может не реализовывать метод
__await__().Если gen_func — функция-генератор, она будет изменена на месте.
Если gen_func — не функция-генератор, она будет обернута. Если она возвращает экземпляр
collections.abc.Generator, экземпляр будет обернут в объект-прокси awaitable. Все другие типы объектов будут возвращены как есть.Добавлен в версии 3.5.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/types.html