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

8.9. types – динамическое создание типов и имена встроенных типовtypes – Dynamic type creation and names for built-in types

Исходный код: Lib/types.py


Этот модуль определяет вспомогательную функцию для динамического создания новых типов.

Он также определяет имена для некоторых объектных типов, которые используются стандартным интерпретатором Python, но не доступны как встроенные, такие как int или str.

Наконец, он предоставляет несколько дополнительных вспомогательных классов и функций, связанных с типами, которые не настолько фундаментальны, чтобы быть встроенными.

8.9.1. Динамическое создание типовDynamic Type Creation

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

Динамически создаёт объект класса, используя соответствующий метакласс.

Первые три аргумента – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), аргументы-ключевые слова (такие как metaclass).

Аргумент exec_body – это колбэк, используемый для заполнения только что созданного пространства имён класса. Он должен принимать пространство имён класса в качестве единственного аргумента и напрямую обновлять пространство имён содержимым класса. Если колбэк не указан, эффект такой же, как при передаче lambda ns: ns.

Новое в версии 3.3.

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

Вычисляет соответствующий метакласс и создаёт пространство имён класса.

Аргументы – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку) и аргументы-ключевые слова (такие как metaclass).

Возвращаемое значение – 3-кортеж: metaclass, namespace, kwds

metaclass – это соответствующий метакласс, namespace – это подготовленное пространство имён класса, а kwds – это обновлённая копия переданного аргумента kwds, из которого удалена запись 'metaclass'. Если аргумент kwds не был передан, будет пустой словарь.

Новое в версии 3.3.

Изменено в версии 3.6: Значение по умолчанию для элемента namespace возвращаемого кортежа изменилось. Теперь сохраняющее порядок вставки отображение используется, когда у метакласса нет метода __prepare__,

См. также

Метаклассы

Полные сведения о процессе создания класса, поддерживаемом этими функциями

PEP 3115 – Метаклассы в Python 3000

Ввёл перехватчик пространства имён __prepare__

8.9.2. Стандартные типы интерпретатораStandard Interpreter Types

Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают лишь попутно при обработке, таких как тип listiterator.

Типичное использование этих имён – для проверок isinstance() или issubclass().

Стандартные имена определены для следующих типов:

types.FunctionType
types.LambdaType

Тип пользовательских функций и функций, созданных lambda выражениями.

types.GeneratorType

Тип объектов генератора-итератора, создаваемых функциями-генераторами.

types.CoroutineType

Тип объектов корутины, создаваемых async def функциями.

Новое в версии 3.5.

types.AsyncGeneratorType

Тип объектов асинхронного генератора-итератора, создаваемых асинхронными функциями-генераторами.

Новое в версии 3.6.

types.CodeType

Тип объектов кода, возвращаемых compile().

types.MethodType

Тип методов экземпляров пользовательских классов.

types.BuiltinFunctionType
types.BuiltinMethodType

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

class types.ModuleType(name, doc=None)

Тип модулей. Конструктор принимает имя создаваемого модуля и, опционально, его докстринг.

Примечание

importlib.util.module_from_spec() применяется для создания нового модуля, если требуется задать различные атрибуты, управляемые импортом.

__doc__

Докстринг модуля. По умолчанию равен None.

__loader__

Загрузчик, загрузивший модуль. По умолчанию равен None.

Изменено в версии 3.4: По умолчанию None. Ранее атрибут был необязательным.

__name__

Имя модуля.

__package__

Пакет, к которому принадлежит модуль. Если модуль является корневым (т.е. не входит ни в один конкретный пакет), то атрибут должен быть установлен в '', в противном случае – в имя пакета (которое может быть __name__, если сам модуль является пакетом). По умолчанию равен None.

Изменено в версии 3.4: По умолчанию None. Ранее атрибут был необязательным.

types.TracebackType

Тип объектов traceback, таких как в sys.exc_info()[2].

types.FrameType

Тип объектов фреймов, которые можно найти в tb.tb_frame, если tb является объектом traceback.

types.GetSetDescriptorType

Тип объектов, определенных в модулях расширения с помощью PyGetSetDef, таких как FrameType.f_locals или array.array.typecode. Этот тип используется в качестве дескриптора атрибутов объектов; он имеет то же назначение, что и тип property, но для классов, определенных в модулях расширения.

types.MemberDescriptorType

Тип объектов, определённых в модулях расширения с помощью PyMemberDef, таких как datetime.timedelta.days. Этот тип используется как дескриптор для простых элементов данных C, которые используют стандартные функции преобразования; он имеет то же назначение, что и тип property, но для классов, определённых в модулях расширения.

Особенность реализации CPython: В других реализациях Python этот тип может быть идентичен GetSetDescriptorType.

class types.MappingProxyType(mapping)

Прокси-объект отображения только для чтения. Он предоставляет динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.

Новое в версии 3.3.

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. Если default не указан, по умолчанию используется None, так что этот метод никогда не возбуждает исключение KeyError.

items()

Возвращает новое представление элементов базового отображения (пары (key, value) ).

keys()

Возвращает новое представление ключей базового отображения.

values()

Возвращает новое представление значений базового отображения.

8.9.3. Дополнительные вспомогательные классы и функцииAdditional Utility Classes and Functions

class types.SimpleNamespace

Простой подкласс object, который предоставляет доступ к атрибутам своего пространства имён, а также осмысленное строковое представление.

В отличие от object, с помощью SimpleNamespace можно добавлять и удалять атрибуты. Если объект SimpleNamespace инициализируется с именованными аргументами, они напрямую добавляются в базовое пространство имён.

Этот тип примерно эквивалентен следующему коду:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

SimpleNamespace может быть полезен в качестве замены class NS: pass. Однако для структурированных записей лучше использовать namedtuple().

Новое в версии 3.3.

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

Перенаправляет доступ к атрибуту класса в __getattr__.

Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе через экземпляр и через класс. Доступ через экземпляр остаётся обычным, но доступ к атрибуту через класс будет перенаправлен в метод __getattr__ класса; это достигается возбуждением исключения AttributeError.

Это даёт возможность иметь свойства, активные на экземпляре, и виртуальные атрибуты с тем же именем на классе (пример – Enum).

Новое в версии 3.4.

8.9.4. Вспомогательные функции для корутинCoroutine Utility Functions

types.coroutine(gen_func)

Эта функция преобразует функцию generator в корутинную функцию, которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является generator iterator, но также считается объектом корутины и является ожидаемым объектом. Однако она может не реализовывать метод __await__().

Если gen_func является функцией-генератором, она будет изменена на месте.

Если gen_func не является функцией-генератором, она будет обёрнута. Если она возвращает экземпляр collections.abc.Generator, экземпляр будет обёрнут в прокси-объект, который является ожидаемым объектом. Все остальные типы объектов будут возвращены как есть.

Новое в версии 3.5.