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.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является объектом трассировки.
-
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 NotImplementedSimpleNamespaceможет быть полезно в качестве замены для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