types — Динамическое создание типов и имена встроенных типов
Исходный код: Lib/types.py
Этот модуль определяет служебные функции для поддержки динамического создания новых типов.
Он также определяет имена некоторых типов объектов, используемых стандартным интерпретатором Python, но не представленных как встроенные, например, int или str.
Наконец, он предоставляет некоторые дополнительные служебные классы и функции, связанные с типами, которые недостаточно фундаментальны, чтобы быть встроенными.
8.9.1. Динамическое создание типов
-
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, kwdsmetaclass — это соответствующий метакласс, namespace — подготовленное пространство имен класса, а kwds — обновленная копия переданного аргумента kwds с удалением всех
'metaclass'элементов. Если аргумент kwds не передан, это будет пустой словарь.Добавлена в версии 3.3.
Изменено в версии 3.6: Значение по умолчанию для элемента
namespaceвозвращаемого кортежа изменено. Теперь используется отображение, сохраняющее порядок вставки, когда метакласс не имеет метода__prepare__.
См. также
- Метаклассы
-
Полные сведения о процессе создания класса, поддерживаемом этими функциями
- PEP 3115 - Метаклассы в Python 3000
-
Ввел хук для пространства имен
__prepare__
8.9.2. Стандартные типы интерпретатора
Этот модуль предоставляет имена многих типов, необходимых для реализации интерпретатора 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 -
Тип объектов отслеживания стека ошибок, например, в
sys.exc_info()[2].
-
types.FrameType -
Тип объектов фреймов, например, в
tb.tb_frameеслиtb— это объект отслеживания стека ошибок.
-
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. Дополнительные служебные классы и функции
-
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. Функции для работы с корутинами
-
types.coroutine(gen_func) -
Эта функция преобразует функцию-генератор в функцию-корутину, которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является итератором генератора, но также считается объектом корутины и является ожидаемым объектом. Однако она необязательно реализует метод
__await__().Если gen_func — функция-генератор, она будет изменена на месте.
Если gen_func не является функцией-генератором, она будет обернута. Если она возвращает экземпляр
collections.abc.Generator, экземпляр будет обернут в ожидаемый прокси-объект. Все другие типы объектов будут возвращены как есть.Новое в версии 3.5.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/types.html