# `types` — Dynamic type creation and names for built-in types

Вихідний код: Lib/types.py

Цей модуль визначає службові функції, які допомагають у динамічному створенні нових типів.

Він також визначає імена для деяких типів об’єктів, які використовуються стандартним інтерпретатором Python, але не представлені у вигляді вбудованих елементів, таких як `int` або `str`.

Нарешті, він надає деякі додаткові пов’язані з типами службові класи та функції, які недостатньо фундаментальні, щоб бути вбудованими.

## Динамічне створення типів

types.new_class(name, bases=(), kwds=None, exec_body=None)

  Динамічно створює об’єкт класу за допомогою відповідного метакласу.

  Перші три аргументи є компонентами, які складають заголовок визначення класу: ім’я класу, базові класи (по порядку), ключові аргументи (такі як `метаклас`).

  Аргумент exec_body є зворотним викликом, який використовується для заповнення щойно створеного простору імен класу. Він повинен приймати простір імен класу як єдиний аргумент і оновлювати простір імен безпосередньо вмістом класу. Якщо зворотний виклик не надано, це матиме той самий ефект, що й передача `lambda ns: None`.

  Added in version 3.3.

types.prepare_class(name, bases=(), kwds=None)

  Обчислює відповідний метаклас і створює простір імен класу.

  Аргументи — це компоненти, які складають заголовок визначення класу: ім’я класу, базові класи (по порядку) і ключові аргументи (такі як `метаклас`).

  Повернене значення є кортежем із трьох: `metaclass, namespace, kwds`

  metaclass — відповідний метаклас, namespace — це підготовлений простір імен класу, а kwds — це оновлена копія переданого аргументу kwds із видаленням будь-якого запису `'metaclass'`. Якщо аргумент kwds не передано, це буде порожній dict.

  Added in version 3.3.

  Змінено в версії 3.6: Значення за замовчуванням для елемента `простір імен` повернутого кортежу змінено. Тепер відображення збереження порядку вставки використовується, коли метаклас не має методу `__prepare__`.

Дивись також

Метакласи

  Повні відомості про процес створення класу, який підтримує ці функції

PEP 3115 - Метакласи в Python 3000

  Представлено хук простору імен `__prepare__`

types.resolve_bases(bases)

  Динамічно вирішувати записи MRO, як зазначено PEP 560.

  This function looks for items in bases that are not instances of `type`, and returns a tuple where each such object that has an `__mro_entries__()` method is replaced with an unpacked result of calling this method. If a bases item is an instance of `type`, or it doesn’t have an `__mro_entries__()` method, then it is included in the return tuple unchanged.

  Added in version 3.7.

types.get_original_bases(cls, /)

  Return the tuple of objects originally given as the bases of cls before the `__mro_entries__()` method has been called on any bases (following the mechanisms laid out in PEP 560). This is useful for introspecting Generics.

  For classes that have an `__orig_bases__` attribute, this function returns the value of `cls.__orig_bases__`. For classes without the `__orig_bases__` attribute, `cls.__bases__` is returned.

  Приклади:

      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,)

  Added in version 3.12.

Дивись також

PEP 560 - Основна підтримка модуля введення та загальних типів

## Типи стандартних інтерпретаторів

Цей модуль надає назви для багатьох типів, необхідних для реалізації інтерпретатора Python. Він навмисно уникає включення деяких типів, які виникають лише випадково під час обробки, таких як тип `listiterator`.

Зазвичай ці імена використовуються для перевірок `isinstance()` або `issubclass()`.

Якщо ви створюєте екземпляр будь-якого з цих типів, зауважте, що підписи можуть відрізнятися в різних версіях Python.

Стандартні імена визначені для таких типів:

types.NoneType

  Тип `None`.

  Added in version 3.10.

types.FunctionType
types.LambdaType

  Тип визначених користувачем функцій і функцій, створених виразами `lambda`.

  Викликає подію аудиту `function.__new__` з аргументом `code`.

  Подія аудиту виникає лише для прямого створення екземплярів функціональних об’єктів і не виникає для звичайної компіляції.

types.GeneratorType

  Тип об’єктів generator-iterator, створених функціями генератора.

types.CoroutineType

  Тип об’єктів coroutine, створених функціями `async def`.

  Added in version 3.5.

types.AsyncGeneratorType

  Тип об’єктів asynchronous generator-iterator, створених функціями асинхронного генератора.

  Added in version 3.6.

class types.CodeType(**kwargs)

  The type of code objects such as returned by `compile()`.

  Викликає подію аудиту `code.__new__` з аргументами `code`, `filename`, `name`, `argcount`, `posonlyargcount`,``kwonlyargcount``, `nlocals`, `stacksize`, `flags`.

  Зауважте, що перевірені аргументи можуть не відповідати іменам або позиціям, які вимагає ініціалізатор. Подія аудиту виникає лише для прямого створення екземпляра об’єктів коду та не виникає для звичайної компіляції.

types.CellType

  The type for cell objects: such objects are used as containers for a function’s closure variables.

  Added in version 3.8.

types.MethodType

  Тип методів екземплярів класу, визначеного користувачем.

types.BuiltinFunctionType
types.BuiltinMethodType

  Тип вбудованих функцій, таких як `len()` або `sys.exit()`, і методи вбудованих класів. (Тут термін «вбудований» означає «написаний на C».)

types.WrapperDescriptorType

  Тип методів деяких вбудованих типів даних і базових класів, таких як `object.__init__()` або `object.__lt__()`.

  Added in version 3.7.

types.MethodWrapperType

  Тип зв’язаних методів деяких вбудованих типів даних і базових класів. Наприклад, це тип `object().__str__`.

  Added in version 3.7.

types.NotImplementedType

  Тип `NotImplemented`.

  Added in version 3.10.

types.MethodDescriptorType

  Тип методів деяких вбудованих типів даних, таких як `str.join()`.

  Added in version 3.7.

types.ClassMethodDescriptorType

  Тип незв’язаних методів класу деяких вбудованих типів даних, таких як `dict.__dict__['fromkeys']`.

  Added in version 3.7.

class types.ModuleType(name, doc=None)

  Тип modules. Конструктор приймає назву модуля, який буде створено, і, за бажанням, його docstring.

  Дивись також

  Documentation on module objects

    Provides details on the special attributes that can be found on instances of `ModuleType`.

  `importlib.util.module_from_spec()`

    Modules created using the `ModuleType` constructor are created with many of their special attributes unset or set to default values. `module_from_spec()` provides a more robust way of creating `ModuleType` instances which ensures the various attributes are set appropriately.

types.EllipsisType

  Тип `Ellipsis`.

  Added in version 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

  Added in version 3.9.

  Змінено в версії 3.9.2: Цей тип тепер може бути підкласом.

  Дивись також

  Загальні типи псевдонімів

    In-depth documentation on instances of `types.GenericAlias`

  PEP 585 - Універсальні підказки типів у стандартних колекціях

    Introducing the `types.GenericAlias` class

class types.UnionType

  Тип виразів типу union.

  Added in version 3.10.

  Змінено в версії 3.14: This is now an alias for `typing.Union`.

class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

  The type of traceback objects such as found in `sys.exception().__traceback__`.

  Перегляньте мовну довідку, щоб отримати детальну інформацію про доступні атрибути та операції, а також вказівки щодо динамічного створення трасування.

types.FrameType

  The type of frame objects such as found in `tb.tb_frame` if `tb` is a traceback object.

types.FrameLocalsProxyType

  The type of frame locals proxy objects, as found on the `frame.f_locals` attribute.

  Added in version 3.15.

  Дивись також

  PEP 667

types.LazyImportType

  The type of lazy import proxy objects. These objects are created when a module is lazily imported and serve as placeholders until the module is actually accessed. This type can be used to detect lazy imports programmatically.

  Added in version 3.15.

  Дивись також

  PEP 810

types.GetSetDescriptorType

  The type of objects defined in extension modules with `PyGetSetDef`, such as `FrameType.f_locals` or `array.array.typecode`. This type is used as descriptor for object attributes; it has the same purpose as the `property` type, but for classes defined in extension modules.

types.MemberDescriptorType

  Тип об’єктів, визначених у модулях розширення за допомогою `PyMemberDef`, наприклад `datetime.timedelta.days`. Цей тип використовується як дескриптор для простих елементів даних C, які використовують стандартні функції перетворення; він має те саме призначення, що й тип `property`, але для класів, визначених у модулях розширення.

  In addition, when a class is defined with a `__slots__` attribute, then for each slot, an instance of `MemberDescriptorType` will be added as an attribute on the class. This allows the slot to appear in the class’s `__dict__`.

  В інших реалізаціях Python цей тип може бути ідентичним `GetSetDescriptorType`.

class types.MappingProxyType(mapping)

  Проксі зіставлення лише для читання. Він забезпечує динамічний перегляд записів відображення, що означає, що коли відображення змінюється, подання відображає ці зміни.

  Added in version 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 не вказано, за замовчуванням буде `None`, тому цей метод ніколи не викликає `KeyError`.

  items()

    Повертає нове подання базових елементів зіставлення (пар «(ключ, значення)»).

  keys()

    Повернути нове подання ключів основного зіставлення.

  values()

    Повернути нове подання значень основного зіставлення.

  reversed(proxy)

    Повертає зворотний ітератор над ключами основного відображення.

    Added in version 3.9.

  hash(proxy)

    Return a hash of the underlying mapping.

    Added in version 3.12.

class types.CapsuleType

  The type of capsule objects.

  Added in version 3.13.

## Додаткові корисні класи та функції

class types.SimpleNamespace

  Простий підклас `object`, який забезпечує доступ атрибутів до свого простору імен, а також значуще відображення.

  Unlike `object`, with `SimpleNamespace` you can add and remove attributes.

  `SimpleNamespace` objects may be initialized in the same way as `dict`: either with keyword arguments, with a single positional argument, or with both. When initialized with keyword arguments, those are directly added to the underlying namespace. Alternatively, when initialized with a positional argument, the underlying namespace will be updated with key-value pairs from that argument (either a mapping object or an iterable object producing key-value pairs). All such keys must be strings.

  Тип приблизно еквівалентний такому коду:

      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 NotImplemented

  `SimpleNamespace` може бути корисним як заміна `class NS: pass`. Однак для структурованого типу запису замість цього використовуйте `namedtuple()`.

  `SimpleNamespace` objects are supported by `copy.replace()`.

  Added in version 3.3.

  Змінено в версії 3.9: Порядок атрибутів у відображенні змінено з алфавітного на вставлення (наприклад, `dict`).

  Змінено в версії 3.13: Added support for an optional positional argument.

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)

  Направте доступ до атрибутів класу до __getattr__.

  Це дескриптор, який використовується для визначення атрибутів, які діють по-різному при доступі через примірник і через клас. Доступ до екземпляра залишається звичайним, але доступ до атрибута через клас буде направлено до методу __getattr__ класу; це робиться шляхом виклику AttributeError.

  Це дозволяє мати активні властивості в екземплярі та мати віртуальні атрибути в класі з таким же іменем (див. `enum.Enum` для прикладу).

  Added in version 3.4.

## Корисні функції співпрограми

types.coroutine(gen_func)

  This function transforms a generator function into a coroutine function which returns a generator-based coroutine. The generator-based coroutine is still a generator iterator, but is also considered to be a coroutine object and is awaitable. However, it may not necessarily implement the `__await__()` method.

  Якщо gen_func є функцією генератора, її буде змінено на місці.

  Якщо gen_func не є функцією генератора, її буде загорнуто. Якщо він повертає екземпляр `collections.abc.Generator`, екземпляр буде загорнутий в очікуваний проксі-об’єкт. Усі інші типи об’єктів буде повернено як є.

  Added in version 3.5.