Документация Python неофициальный перевод

types.md

401 строк · 27.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3/library/types.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `types` – Динамическое создание типов и имена для встроенных типов89**Исходный код:** [Lib/types.py](https://python-all.ru/src/3.14/Lib/types.py)1011---1213Этот модуль определяет вспомогательные функции для динамического создания новых типов.1415Он также определяет имена для некоторых объектных типов, которые используются стандартным интерпретатором Python, но не доступны как встроенные, такие как [`int`](https://python-all.ru/3/library/functions.html#int) или [`str`](https://python-all.ru/3/library/stdtypes.html#str).1617Наконец, он предоставляет несколько дополнительных вспомогательных классов и функций, связанных с типами, которые не настолько фундаментальны, чтобы быть встроенными.1819## Динамическое создание типов2021#### `types.new_class(name, bases=(), kwds=None, exec_body=None)`2223Динамически создаёт объект класса, используя соответствующий метакласс.2425Первые три аргумента – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), аргументы-ключевые слова (такие как `metaclass`).2627Аргумент *exec\_body* – это колбэк, используемый для заполнения только что созданного пространства имён класса. Он должен принимать пространство имён класса в качестве единственного аргумента и напрямую обновлять пространство имён содержимым класса. Если колбэк не указан, эффект такой же, как при передаче `lambda ns: None`.2829Добавлено в версии 3.3.3031#### `types.prepare_class(name, bases=(), kwds=None)`3233Вычисляет соответствующий метакласс и создаёт пространство имён класса.3435Аргументы – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку) и аргументы-ключевые слова (такие как `metaclass`).3637Возвращаемое значение – 3-кортеж: `metaclass, namespace, kwds`3839*metaclass* – это соответствующий метакласс, *namespace* – это подготовленное пространство имён класса, а *kwds* – это обновлённая копия переданного аргумента *kwds*, из которого удалена запись `'metaclass'`. Если аргумент *kwds* не был передан, будет пустой словарь.4041Добавлено в версии 3.3.4243Изменено в версии 3.6: Значение по умолчанию для элемента `namespace` возвращаемого кортежа изменилось. Теперь используется отображение, сохраняющее порядок вставки, если метакласс не имеет метода `__prepare__`.4445> **См. также**46>47> **[Метаклассы](https://python-all.ru/3/reference/datamodel.html#metaclasses)**48>49> Полные сведения о процессе создания класса, поддерживаемом этими функциями50>51> **[**PEP 3115**](https://python-all.ru/3/library/types.html) – Метаклассы в Python 3000**52>53> Ввёл перехватчик пространства имён `__prepare__`5455#### `types.resolve_bases(bases)`5657Разрешает записи MRO динамически, как указано в [**PEP 560**](https://python-all.ru/3/library/types.html).5859Эта функция ищет элементы в *bases*, которые не являются экземплярами [`type`](https://python-all.ru/3/library/functions.html#type), и возвращает кортеж, в котором каждый такой объект, имеющий метод [`__mro_entries__()`](https://python-all.ru/3/reference/datamodel.html#object.__mro_entries__), заменяется распакованным результатом вызова этого метода. Если элемент *bases* является экземпляром `type` или не имеет метода `__mro_entries__()`, он включается в возвращаемый кортеж без изменений.6061Добавлено в версии 3.7.6263#### `types.get_original_bases(cls, /)`6465Возвращает кортеж объектов, изначально заданных как базовые классы *cls* до того, как метод [`__mro_entries__()`](https://python-all.ru/3/reference/datamodel.html#object.__mro_entries__) был вызван для любых базовых классов (следуя механизмам, изложенным в [**PEP 560**](https://python-all.ru/3/library/types.html)). Это полезно для интроспекции [обобщённых типов](https://python-all.ru/3/library/typing.html#user-defined-generics).6667Для классов, имеющих атрибут `__orig_bases__`, эта функция возвращает значение `cls.__orig_bases__`. Для классов без атрибута `__orig_bases__` возвращается [`cls.__bases__`](https://python-all.ru/3/reference/datamodel.html#type.__bases__).6869Примеры:7071```python72from typing import TypeVar, Generic, NamedTuple, TypedDict7374T = TypeVar("T")75class Foo(Generic[T]): ...76class Bar(Foo[int], float): ...77class Baz(list[str]): ...78Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])79Spam = TypedDict("Spam", {"a": int, "b": str})8081assert Bar.__bases__ == (Foo, float)82assert get_original_bases(Bar) == (Foo[int], float)8384assert Baz.__bases__ == (list,)85assert get_original_bases(Baz) == (list[str],)8687assert Eggs.__bases__ == (tuple,)88assert get_original_bases(Eggs) == (NamedTuple,)8990assert Spam.__bases__ == (dict,)91assert get_original_bases(Spam) == (TypedDict,)9293assert int.__bases__ == (object,)94assert get_original_bases(int) == (object,)95```9697Добавлено в версии 3.12.9899> **См. также**100>101> [**PEP 560**](https://python-all.ru/3/library/types.html) – Базовая поддержка модуля typing и обобщённых типов102103## Стандартные типы интерпретатора104105Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают лишь попутно при обработке, таких как тип `listiterator`.106107Типичное использование этих имён – для проверок [`isinstance()`](https://python-all.ru/3/library/functions.html#isinstance) или [`issubclass()`](https://python-all.ru/3/library/functions.html#issubclass).108109При создании экземпляров любого из этих типов учтите, что сигнатуры могут различаться в разных версиях Python.110111Стандартные имена определены для следующих типов:112113#### `class types.NoneType`114115Тип [`None`](https://python-all.ru/3/library/constants.html#None).116117Добавлено в версии 3.10.118119#### `types.FunctionType`120121#### `types.LambdaType`122123Тип пользовательских функций и функций, созданных [`lambda`](https://python-all.ru/3/reference/expressions.html#lambda) выражениями.124125Вызывает [событие аудита](https://python-all.ru/3/library/sys.html#auditing) `function.__new__` с аргументом `code`.126127Событие аудита происходит только при прямом создании объектов функций и не возникает при обычной компиляции.128129#### `types.GeneratorType`130131Тип объектов [генератора](https://python-all.ru/3/glossary.html#term-generator)-итератора, создаваемых функциями-генераторами.132133#### `types.CoroutineType`134135Тип объектов [корутины](https://python-all.ru/3/glossary.html#term-coroutine), создаваемых [`async def`](https://python-all.ru/3/reference/compound_stmts.html#async-def) функциями.136137Добавлено в версии 3.5.138139#### `types.AsyncGeneratorType`140141Тип объектов [асинхронного генератора](https://python-all.ru/3/glossary.html#term-asynchronous-generator)-итератора, создаваемых асинхронными функциями-генераторами.142143Добавлено в версии 3.6.144145#### `class types.CodeType(**kwargs)`146147Тип [объектов кода](https://python-all.ru/3/reference/datamodel.html#code-objects), таких как возвращаемые [`compile()`](https://python-all.ru/3/library/functions.html#compile).148149Вызывает [событие аудита](https://python-all.ru/3/library/sys.html#auditing) `code.__new__` с аргументами `code`, `filename`, `name`, `argcount`, `posonlyargcount`, `kwonlyargcount`, `nlocals`, `stacksize`, `flags`.150151Обратите внимание, что проверяемые аргументы могут не соответствовать именам или позициям, требуемым инициализатором. Событие аудита происходит только при прямом создании объектов кода и не возникает при обычной компиляции.152153#### `types.CellType`154155Тип для объектов ячеек: такие объекты используются как контейнеры для [замыкающих переменных](https://python-all.ru/3/glossary.html#term-closure-variable) функции.156157Добавлено в версии 3.8.158159#### `types.MethodType`160161Тип методов экземпляров пользовательских классов.162163#### `types.BuiltinFunctionType`164165#### `types.BuiltinMethodType`166167Тип встроенных функций, таких как [`len()`](https://python-all.ru/3/library/functions.html#len) или [`sys.exit()`](https://python-all.ru/3/library/sys.html#sys.exit), и методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)168169#### `types.WrapperDescriptorType`170171Тип методов некоторых встроенных типов данных и базовых классов, таких как [`object.__init__()`](https://python-all.ru/3/reference/datamodel.html#object.__init__) или [`object.__lt__()`](https://python-all.ru/3/reference/datamodel.html#object.__lt__).172173Добавлено в версии 3.7.174175#### `types.MethodWrapperType`176177Тип *связанных* методов некоторых встроенных типов данных и базовых классов. Например, это тип `object().__str__`.178179Добавлено в версии 3.7.180181#### `class types.NotImplementedType`182183Тип [`NotImplemented`](https://python-all.ru/3/library/constants.html#NotImplemented).184185Добавлено в версии 3.10.186187#### `types.MethodDescriptorType`188189Тип методов некоторых встроенных типов данных, таких как [`str.join()`](https://python-all.ru/3/library/stdtypes.html#str.join).190191Добавлено в версии 3.7.192193#### `types.ClassMethodDescriptorType`194195Тип *несвязанных* методов классов некоторых встроенных типов данных, таких как `dict.__dict__['fromkeys']`.196197Добавлено в версии 3.7.198199#### `class types.ModuleType(name, doc=None)`200201Тип [модулей](https://python-all.ru/3/glossary.html#term-module). Конструктор принимает имя создаваемого модуля и, опционально, его [докстринг](https://python-all.ru/3/glossary.html#term-docstring).202203> **См. также**204>205> **[Документация по объектам модулей](https://python-all.ru/3/reference/datamodel.html#module-objects)**206>207> Содержит подробную информацию о специальных атрибутах, которые можно найти в экземплярах `ModuleType`.208>209> **[`importlib.util.module_from_spec()`](https://python-all.ru/3/library/importlib.html#importlib.util.module_from_spec)**210>211> Модули, созданные с помощью конструктора `ModuleType`, создаются с большинством специальных атрибутов, не заданных или установленных в значения по умолчанию. `module_from_spec()` предоставляет более надёжный способ создания экземпляров `ModuleType`, который гарантирует, что различные атрибуты будут установлены правильно.212213#### `class types.EllipsisType`214215Тип [`Ellipsis`](https://python-all.ru/3/library/constants.html#Ellipsis).216217Добавлено в версии 3.10.218219#### `class types.GenericAlias(t_origin, t_args)`220221Тип [параметризованных дженериков](https://python-all.ru/3/library/stdtypes.html#types-genericalias), таких как `list[int]`.222223`t_origin` должен быть непараметризованным обобщённым классом, таким как `list`, `tuple` или `dict`. `t_args` должен быть [`tuple`](https://python-all.ru/3/library/stdtypes.html#tuple) (возможно, длины 1) из типов, которые параметризуют `t_origin`:224225```python226>>> from types import GenericAlias227228>>> list[int] == GenericAlias(list, (int,))229True230>>> dict[str, int] == GenericAlias(dict, (str, int))231True232```233234Добавлено в версии 3.9.235236Изменено в версии 3.9.2: Теперь этот тип можно наследовать.237238> **См. также**239>240> **[Типы обобщённых псевдонимов](https://python-all.ru/3/library/stdtypes.html#types-genericalias)**241>242> Подробная документация по экземплярам `types.GenericAlias`243>244> **[**PEP 585**](https://python-all.ru/3/library/types.html) – Аннотации обобщённых типов в стандартных коллекциях**245>246> Знакомство с классом `types.GenericAlias`247248#### `class types.UnionType`249250Тип [выражений типов объединений](https://python-all.ru/3/library/stdtypes.html#types-union).251252Добавлено в версии 3.10.253254Изменено в версии 3.14: Теперь это псевдоним для [`typing.Union`](https://python-all.ru/3/library/typing.html#typing.Union).255256#### `class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)`257258Тип объектов traceback, таких как в `sys.exception().__traceback__`.259260См. [справочник по языку](https://python-all.ru/3/reference/datamodel.html#traceback-objects) для получения подробной информации о доступных атрибутах и операциях, а также рекомендации по динамическому созданию трассировок.261262#### `types.FrameType`263264Тип [объектов фреймов](https://python-all.ru/3/reference/datamodel.html#frame-objects), таких как в [`tb.tb_frame`](https://python-all.ru/3/reference/datamodel.html#traceback.tb_frame), если `tb` является объектом traceback.265266#### `types.GetSetDescriptorType`267268Тип объектов, определённых в модулях расширения с помощью `PyGetSetDef`, таких как [`FrameType.f_locals`](https://python-all.ru/3/reference/datamodel.html#frame.f_locals) или `array.array.typecode`. Этот тип используется как дескриптор для атрибутов объектов; он имеет то же назначение, что и тип [`property`](https://python-all.ru/3/library/functions.html#property), но для классов, определённых в модулях расширения.269270#### `types.MemberDescriptorType`271272Тип объектов, определённых в модулях расширения с помощью `PyMemberDef`, таких как `datetime.timedelta.days`. Этот тип используется как дескриптор для простых элементов данных C, которые используют стандартные функции преобразования; он имеет то же назначение, что и тип [`property`](https://python-all.ru/3/library/functions.html#property), но для классов, определённых в модулях расширения.273274Кроме того, когда класс определён с атрибутом [`__slots__`](https://python-all.ru/3/reference/datamodel.html#object.__slots__), то для каждого слота экземпляр `MemberDescriptorType` будет добавлен как атрибут класса. Это позволяет слоту отображаться в [`__dict__`](https://python-all.ru/3/reference/datamodel.html#type.__dict__) класса.275276**Особенность реализации CPython:** В других реализациях Python этот тип может быть идентичен `GetSetDescriptorType`.277278#### `class types.MappingProxyType(mapping)`279280Прокси-объект отображения только для чтения. Он предоставляет динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.281282`MappingProxyType` являются [обобщёнными](https://python-all.ru/3/library/typing.html#generics) по двум типам, обозначающим (соответственно) типы ключей и значений базового отображения.283284Добавлено в версии 3.3.285286Изменено в версии 3.9: Обновлено для поддержки нового оператора объединения (`|`) из [**PEP 584**](https://python-all.ru/3/library/types.html), который просто делегирует базовому отображению.287288#### `key in proxy`289290Возвращает `True`, если в базовом отображении присутствует ключ *key*, иначе `False`.291292#### `proxy[key]`293294Возвращает элемент базового отображения с ключом *key*. Возбуждает исключение [`KeyError`](https://python-all.ru/3/library/exceptions.html#KeyError), если *key* отсутствует в базовом отображении.295296#### `iter(proxy)`297298Возвращает итератор по ключам базового отображения. Это краткая форма записи для `iter(proxy.keys())`.299300#### `len(proxy)`301302Возвращает количество элементов в базовом отображении.303304#### `copy()`305306Возвращает поверхностную копию базового отображения.307308#### `get(key[, default])`309310Возвращает значение для *key*, если *key* присутствует в базовом отображении, иначе *default*. Если *default* не указан, по умолчанию используется `None`, так что этот метод никогда не возбуждает исключение [`KeyError`](https://python-all.ru/3/library/exceptions.html#KeyError).311312#### `items()`313314Возвращает новое представление элементов базового отображения (пары `(key, value)` ).315316#### `keys()`317318Возвращает новое представление ключей базового отображения.319320#### `values()`321322Возвращает новое представление значений базового отображения.323324#### `reversed(proxy)`325326Возвращает обратный итератор по ключам базового отображения.327328Добавлено в версии 3.9.329330#### `hash(proxy)`331332Возвращает хеш базового отображения.333334Добавлено в версии 3.12.335336#### `class types.CapsuleType`337338Тип [объектов-капсул](https://python-all.ru/3/c-api/capsule.html#capsules).339340Добавлено в версии 3.13.341342## Дополнительные вспомогательные классы и функции343344#### `class types.SimpleNamespace`345346Простой подкласс [`object`](https://python-all.ru/3/library/functions.html#object), который предоставляет доступ к атрибутам своего пространства имён, а также осмысленное строковое представление.347348В отличие от [`object`](https://python-all.ru/3/library/functions.html#object), с помощью `SimpleNamespace` можно добавлять и удалять атрибуты.349350Объекты `SimpleNamespace` можно инициализировать так же, как [`dict`](https://python-all.ru/3/library/stdtypes.html#dict): с помощью именованных аргументов, с помощью одного позиционного аргумента или обоими способами. При инициализации именованными аргументами они напрямую добавляются в базовое пространство имён. При инициализации позиционным аргументом базовое пространство имён обновляется парами ключ-значение из этого аргумента (объекта отображения или объекта [iterable](https://python-all.ru/3/glossary.html#term-iterable), порождающего пары ключ-значение). Все такие ключи должны быть строками.351352Этот тип примерно эквивалентен следующему коду:353354```python355class SimpleNamespace:356    def __init__(self, mapping_or_iterable=(), /, **kwargs):357        self.__dict__.update(mapping_or_iterable)358        self.__dict__.update(kwargs)359360    def __repr__(self):361        items = (f"{k}={v!r}" for k, v in self.__dict__.items())362        return "{}({})".format(type(self).__name__, ", ".join(items))363364    def __eq__(self, other):365        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):366           return self.__dict__ == other.__dict__367        return NotImplemented368```369370`SimpleNamespace` может быть полезен в качестве замены `class NS: pass`. Однако для структурированных записей лучше использовать [`namedtuple()`](https://python-all.ru/3/library/collections.html#collections.namedtuple).371372Объекты `SimpleNamespace` поддерживаются [`copy.replace()`](https://python-all.ru/3/library/copy.html#copy.replace).373374Добавлено в версии 3.3.375376Изменено в версии 3.9: Порядок атрибутов в строковом представлении изменён с алфавитного на порядок вставки (как в `dict`).377378Изменено в версии 3.13: Добавлена поддержка необязательного позиционного аргумента.379380#### `types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)`381382Перенаправляет доступ к атрибуту класса в \_\_getattr\_\_.383384Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе через экземпляр и через класс. Доступ через экземпляр остаётся обычным, но доступ к атрибуту через класс будет перенаправлен в метод \_\_getattr\_\_ класса; это достигается возбуждением исключения AttributeError.385386Это позволяет иметь свойства, активные на экземпляре, и виртуальные атрибуты на классе с тем же именем (см. [`enum.Enum`](https://python-all.ru/3/library/enum.html#enum.Enum) для примера).387388Добавлено в версии 3.4.389390## Вспомогательные функции корутин391392#### `types.coroutine(gen_func)`393394Эта функция преобразует функцию [generator](https://python-all.ru/3/glossary.html#term-generator) в [корутинную функцию](https://python-all.ru/3/glossary.html#term-coroutine-function), которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является [generator iterator](https://python-all.ru/3/glossary.html#term-generator-iterator), но также считается объектом [корутины](https://python-all.ru/3/glossary.html#term-coroutine) и является [ожидаемым объектом](https://python-all.ru/3/glossary.html#term-awaitable). Однако она может не реализовывать метод [`__await__()`](https://python-all.ru/3/reference/datamodel.html#object.__await__).395396Если *gen\_func* является функцией-генератором, она будет изменена на месте.397398Если *gen\_func* не является функцией-генератором, она будет обёрнута. Если она возвращает экземпляр [`collections.abc.Generator`](https://python-all.ru/3/library/collections.abc.html#collections.abc.Generator), экземпляр будет обёрнут в прокси-объект, который является *ожидаемым объектом*. Все остальные типы объектов будут возвращены как есть.399400Добавлено в версии 3.5.401