types.md
1> **Источник:** https://python-all.ru/3.6/library/types.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.9. [`types`](https://python-all.ru/3.6/library/types.html#module-types) – динамическое создание типов и имена встроенных типов89**Исходный код:** [Lib/types.py](https://python-all.ru/src/3.6/Lib/types.py)1011---1213Этот модуль определяет вспомогательную функцию для динамического создания новых типов.1415Он также определяет имена для некоторых объектных типов, которые используются стандартным интерпретатором Python, но не доступны как встроенные, такие как [`int`](https://python-all.ru/3.6/library/functions.html#int) или [`str`](https://python-all.ru/3.6/library/stdtypes.html#str).1617Наконец, он предоставляет несколько дополнительных вспомогательных классов и функций, связанных с типами, которые не настолько фундаментальны, чтобы быть встроенными.1819## 8.9.1. Динамическое создание типов2021#### `types.new_class(name, bases=(), kwds=None, exec_body=None)`2223Динамически создаёт объект класса, используя соответствующий метакласс.2425Первые три аргумента – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), аргументы-ключевые слова (такие как `metaclass`).2627Аргумент *exec\_body* – это колбэк, используемый для заполнения только что созданного пространства имён класса. Он должен принимать пространство имён класса в качестве единственного аргумента и напрямую обновлять пространство имён содержимым класса. Если колбэк не указан, эффект такой же, как при передаче `lambda ns: ns`.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.6/reference/datamodel.html#metaclasses)**48>49> Полные сведения о процессе создания класса, поддерживаемом этими функциями50>51> **[**PEP 3115**](https://python-all.ru/3.6/library/types.html) – Метаклассы в Python 3000**52>53> Ввёл перехватчик пространства имён `__prepare__`5455## 8.9.2. Стандартные типы интерпретатора5657Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают лишь попутно при обработке, таких как тип `listiterator`.5859Типичное использование этих имён – для проверок [`isinstance()`](https://python-all.ru/3.6/library/functions.html#isinstance) или [`issubclass()`](https://python-all.ru/3.6/library/functions.html#issubclass).6061Стандартные имена определены для следующих типов:6263#### `types.FunctionType`6465#### `types.LambdaType`6667Тип пользовательских функций и функций, созданных [`lambda`](https://python-all.ru/3.6/reference/expressions.html#lambda) выражениями.6869#### `types.GeneratorType`7071Тип объектов [генератора](https://python-all.ru/3.6/glossary.html#term-generator)-итератора, создаваемых функциями-генераторами.7273#### `types.CoroutineType`7475Тип объектов [корутины](https://python-all.ru/3.6/glossary.html#term-coroutine), создаваемых [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def) функциями.7677Новое в версии 3.5.7879#### `types.AsyncGeneratorType`8081Тип объектов [асинхронного генератора](https://python-all.ru/3.6/glossary.html#term-asynchronous-generator)-итератора, создаваемых асинхронными функциями-генераторами.8283Новое в версии 3.6.8485#### `types.CodeType`8687Тип объектов кода, возвращаемых [`compile()`](https://python-all.ru/3.6/library/functions.html#compile).8889#### `types.MethodType`9091Тип методов экземпляров пользовательских классов.9293#### `types.BuiltinFunctionType`9495#### `types.BuiltinMethodType`9697Тип встроенных функций, таких как [`len()`](https://python-all.ru/3.6/library/functions.html#len) или [`sys.exit()`](https://python-all.ru/3.6/library/sys.html#sys.exit), и методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)9899#### `class types.ModuleType(name, doc=None)`100101Тип [модулей](https://python-all.ru/3.6/glossary.html#term-module). Конструктор принимает имя создаваемого модуля и, опционально, его [докстринг](https://python-all.ru/3.6/glossary.html#term-docstring).102103> **Примечание**104>105> [`importlib.util.module_from_spec()`](https://python-all.ru/3.6/library/importlib.html#importlib.util.module_from_spec) применяется для создания нового модуля, если требуется задать различные атрибуты, управляемые импортом.106107#### `__doc__`108109[Докстринг](https://python-all.ru/3.6/glossary.html#term-docstring) модуля. По умолчанию равен `None`.110111#### `__loader__`112113[Загрузчик](https://python-all.ru/3.6/glossary.html#term-loader), загрузивший модуль. По умолчанию равен `None`.114115Изменено в версии 3.4: По умолчанию `None`. Ранее атрибут был необязательным.116117#### `__name__`118119Имя модуля.120121#### `__package__`122123[Пакет](https://python-all.ru/3.6/glossary.html#term-package), к которому принадлежит модуль. Если модуль является корневым (т.е. не входит ни в один конкретный пакет), то атрибут должен быть установлен в `''`, в противном случае – в имя пакета (которое может быть [`__name__`](https://python-all.ru/3.6/reference/import.html#__name__), если сам модуль является пакетом). По умолчанию равен `None`.124125Изменено в версии 3.4: По умолчанию `None`. Ранее атрибут был необязательным.126127#### `types.TracebackType`128129Тип объектов traceback, таких как в `sys.exc_info()[2]`.130131#### `types.FrameType`132133Тип объектов фреймов, которые можно найти в `tb.tb_frame`, если `tb` является объектом traceback.134135#### `types.GetSetDescriptorType`136137Тип объектов, определенных в модулях расширения с помощью `PyGetSetDef`, таких как `FrameType.f_locals` или `array.array.typecode`. Этот тип используется в качестве дескриптора атрибутов объектов; он имеет то же назначение, что и тип [`property`](https://python-all.ru/3.6/library/functions.html#property), но для классов, определенных в модулях расширения.138139#### `types.MemberDescriptorType`140141Тип объектов, определённых в модулях расширения с помощью `PyMemberDef`, таких как `datetime.timedelta.days`. Этот тип используется как дескриптор для простых элементов данных C, которые используют стандартные функции преобразования; он имеет то же назначение, что и тип [`property`](https://python-all.ru/3.6/library/functions.html#property), но для классов, определённых в модулях расширения.142143**Особенность реализации CPython:** В других реализациях Python этот тип может быть идентичен `GetSetDescriptorType`.144145#### `class types.MappingProxyType(mapping)`146147Прокси-объект отображения только для чтения. Он предоставляет динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.148149Новое в версии 3.3.150151#### `key in proxy`152153Возвращает `True`, если в базовом отображении присутствует ключ *key*, иначе `False`.154155#### `proxy[key]`156157Возвращает элемент базового отображения с ключом *key*. Возбуждает исключение [`KeyError`](https://python-all.ru/3.6/library/exceptions.html#KeyError), если *key* отсутствует в базовом отображении.158159#### `iter(proxy)`160161Возвращает итератор по ключам базового отображения. Это краткая форма записи для `iter(proxy.keys())`.162163#### `len(proxy)`164165Возвращает количество элементов в базовом отображении.166167#### `copy()`168169Возвращает поверхностную копию базового отображения.170171#### `get(key[, default])`172173Возвращает значение для *key*, если *key* присутствует в базовом отображении, иначе *default*. Если *default* не указан, по умолчанию используется `None`, так что этот метод никогда не возбуждает исключение [`KeyError`](https://python-all.ru/3.6/library/exceptions.html#KeyError).174175#### `items()`176177Возвращает новое представление элементов базового отображения (пары `(key, value)` ).178179#### `keys()`180181Возвращает новое представление ключей базового отображения.182183#### `values()`184185Возвращает новое представление значений базового отображения.186187## 8.9.3. Дополнительные вспомогательные классы и функции188189#### `class types.SimpleNamespace`190191Простой подкласс [`object`](https://python-all.ru/3.6/library/functions.html#object), который предоставляет доступ к атрибутам своего пространства имён, а также осмысленное строковое представление.192193В отличие от [`object`](https://python-all.ru/3.6/library/functions.html#object), с помощью `SimpleNamespace` можно добавлять и удалять атрибуты. Если объект `SimpleNamespace` инициализируется с именованными аргументами, они напрямую добавляются в базовое пространство имён.194195Этот тип примерно эквивалентен следующему коду:196197```python198class SimpleNamespace:199 def __init__(self, **kwargs):200 self.__dict__.update(kwargs)201202 def __repr__(self):203 keys = sorted(self.__dict__)204 items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)205 return "{}({})".format(type(self).__name__, ", ".join(items))206207 def __eq__(self, other):208 return self.__dict__ == other.__dict__209```210211`SimpleNamespace` может быть полезен в качестве замены `class NS: pass`. Однако для структурированных записей лучше использовать [`namedtuple()`](https://python-all.ru/3.6/library/collections.html#collections.namedtuple).212213Новое в версии 3.3.214215#### `types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)`216217Перенаправляет доступ к атрибуту класса в \_\_getattr\_\_.218219Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе через экземпляр и через класс. Доступ через экземпляр остаётся обычным, но доступ к атрибуту через класс будет перенаправлен в метод \_\_getattr\_\_ класса; это достигается возбуждением исключения AttributeError.220221Это даёт возможность иметь свойства, активные на экземпляре, и виртуальные атрибуты с тем же именем на классе (пример – Enum).222223Новое в версии 3.4.224225## 8.9.4. Вспомогательные функции для корутин226227#### `types.coroutine(gen_func)`228229Эта функция преобразует функцию [generator](https://python-all.ru/3.6/glossary.html#term-generator) в [корутинную функцию](https://python-all.ru/3.6/glossary.html#term-coroutine-function), которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является [generator iterator](https://python-all.ru/3.6/glossary.html#term-generator-iterator), но также считается объектом [корутины](https://python-all.ru/3.6/glossary.html#term-coroutine) и является [ожидаемым объектом](https://python-all.ru/3.6/glossary.html#term-awaitable). Однако она может не реализовывать метод [`__await__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__await__).230231Если *gen\_func* является функцией-генератором, она будет изменена на месте.232233Если *gen\_func* не является функцией-генератором, она будет обёрнута. Если она возвращает экземпляр [`collections.abc.Generator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Generator), экземпляр будет обёрнут в прокси-объект, который является *ожидаемым объектом*. Все остальные типы объектов будут возвращены как есть.234235Новое в версии 3.5.236