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.

Нове в версії 3.3.

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

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

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

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

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

Нове в версії 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.

Нове в версії 3.7.

Дивись також

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

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

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

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

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

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

types.FunctionType
types.LambdaType

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

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

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

types.GeneratorType

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

types.CoroutineType

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

Нове в версії 3.5.

types.AsyncGeneratorType

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

Нове в версії 3.6.

class types.CodeType(**kwargs)

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

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

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

replace(**kwargs)

Return a copy of the code object with new values for the specified fields.

Нове в версії 3.8.

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.MethodDescriptorType

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

Нове в версії 3.7.

types.ClassMethodDescriptorType

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

Нове в версії 3.7.

class types.ModuleType(name, doc=None)

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

Примітка

Використовуйте importlib.util.module_from_spec(), щоб створити новий модуль, якщо ви бажаєте встановити різні атрибути, керовані імпортом.

__doc__

docstring модуля. За замовчуванням None.

__loader__

loader, який завантажив модуль. За замовчуванням None.

This attribute is to match importlib.machinery.ModuleSpec.loader as stored in the attr:__spec__ object.

Примітка

Майбутня версія Python може припинити встановлення цього атрибута за замовчуванням. Щоб захиститися від цієї потенційної зміни, бажано читати з атрибута __spec__ або використовувати getattr(module, "__loader__", None), якщо вам явно потрібно використовувати цей атрибут.

Змінено в версії 3.4: За замовчуванням None. Раніше атрибут був необов’язковим.

__name__

Назва модуля. Очікується відповідність importlib.machinery.ModuleSpec.name.

__package__

До якого package належить модуль. Якщо модуль верхнього рівня (тобто не є частиною будь-якого конкретного пакета), тоді для атрибута має бути встановлено значення '', інакше для нього має бути встановлено назву пакета (яке може бути __name__, якщо модуль сам є пакетом). За замовчуванням None.

This attribute is to match importlib.machinery.ModuleSpec.parent as stored in the attr:__spec__ object.

Примітка

Майбутня версія Python може припинити встановлення цього атрибута за замовчуванням. Щоб захиститися від цієї потенційної зміни, бажано читати з атрибута __spec__ або використовувати getattr(module, "__package__", None), якщо вам явно потрібно використовувати цей атрибут.

Змінено в версії 3.4: За замовчуванням None. Раніше атрибут був необов’язковим.

__spec__

Запис стану модуля, пов’язаного з системою імпорту. Очікується, що це буде екземпляр importlib.machinery.ModuleSpec.

Нове в версії 3.4.

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: Цей тип тепер може бути підкласом.

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

The type of traceback objects such as found in sys.exc_info()[2].

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

types.FrameType

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

See the language reference for details of the available attributes and operations.

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, але для класів, визначених у модулях розширення.

CPython implementation detail: В інших реалізаціях 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 не вказано, за замовчуванням буде None, тому цей метод ніколи не викликає KeyError.

items()

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

keys()

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

values()

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

reversed(proxy)

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

Нове в версії 3.9.

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

class types.SimpleNamespace

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

Unlike object, with SimpleNamespace you can add and remove attributes. If a SimpleNamespace object is initialized with keyword arguments, those are directly added to the underlying namespace.

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

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 NotImplemented

SimpleNamespace може бути корисним як заміна 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)

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, екземпляр буде загорнутий в очікуваний проксі-об’єкт. Усі інші типи об’єктів буде повернено як є.

Нове в версії 3.5.