types — Динамическое создание типов и имена встроенных типов
Исходный код: Lib/types.py
Этот модуль определяет вспомогательные функции для динамического создания новых типов.
В нём также определены имена некоторых типов объектов, используемых стандартным интерпретатором Python, но не предоставляемых в качестве встроенных типов, таких как int или str.
Наконец, он предоставляет дополнительные вспомогательные классы и функции, связанные с типами, которые недостаточно фундаментальны, чтобы быть встроенными.
Динамическое создание типов
-
types.new_class(name, bases=(), kwds=None, exec_body=None) -
Динамически создаёт объект класса с использованием подходящего метакласса.
Первые три аргумента — это компоненты заголовка определения класса: имя класса, базовые классы (в указанном порядке) и именованные аргументы (например,
metaclass).Аргумент exec_body — это функция обратного вызова, которая используется для заполнения пространства имён только что созданного класса. Она должна принимать пространство имён класса как единственный аргумент и непосредственно обновлять его содержимым класса. Если функция обратного вызова не указана, результат будет таким же, как при передаче
lambda ns: None.Добавлено в версии 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__
-
types.resolve_bases(bases) -
Динамически разрешает записи MRO согласно PEP 560.
Эта функция ищет в bases элементы, которые не являются экземплярами
type, и возвращает кортеж, в котором каждый такой объект, имеющий метод__mro_entries__(), заменяется распакованным результатом вызова этого метода. Если элемент bases является экземпляромtypeили у него нет метода__mro_entries__(), он включается в возвращаемый кортеж без изменений.Добавлено в версии 3.7.
См. также
PEP 560 — Поддержка модуля typing и обобщённых типов на уровне ядра
Стандартные типы интерпретатора
Этот модуль предоставляет имена многих типов, необходимых для реализации интерпретатора Python. В нём намеренно не включены некоторые типы, возникающие лишь попутно в ходе обработки, например тип listiterator.
Обычно эти имена используются для проверок isinstance() или issubclass().
Если вы создаёте экземпляры любого из этих типов, учтите, что сигнатуры могут различаться в разных версиях Python.
Стандартные имена определены для следующих типов:
-
types.NoneType -
Тип значения
None.Добавлено в версии 3.10.
-
types.FunctionType -
types.LambdaType -
Тип пользовательских функций и функций, создаваемых выражениями
lambda.Вызывает событие аудита
function.__new__с аргументомcode.Событие аудита возникает только при непосредственном создании объектов функций и не вызывается при обычной компиляции.
-
types.GeneratorType -
Тип объектов-итераторов генераторов, создаваемых функциями-генераторами.
-
types.AsyncGeneratorType -
Тип объектов-итераторов асинхронных генераторов, создаваемых асинхронными функциями-генераторами.
Добавлено в версии 3.6.
-
class types.CodeType(**kwargs) -
Тип объектов кода, например тех, которые возвращает
compile().Вызывает событие аудита
code.__new__с аргументамиcode,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags.Обратите внимание, что проверяемые аргументы могут не совпадать с именами или позициями, требуемыми инициализатором. Событие аудита возникает только при непосредственном создании объектов кода и не вызывается при обычной компиляции.
-
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.NotImplementedType -
Тип значения
NotImplemented.Добавлено в версии 3.10.
-
types.MethodDescriptorType -
Тип методов некоторых встроенных типов данных, таких как
str.join().Добавлено в версии 3.7.
-
types.ClassMethodDescriptorType -
Тип несвязанных методов классов некоторых встроенных типов данных, таких как
dict.__dict__['fromkeys'].Добавлено в версии 3.7.
-
class types.ModuleType(name, doc=None) -
Тип модулей. Конструктор принимает имя создаваемого модуля и, при необходимости, его строку документации.
Примечание
Чтобы создать новый модуль и задать различные атрибуты, контролируемые механизмом импорта, используйте
importlib.util.module_from_spec().-
__doc__ -
Строка документации модуля. По умолчанию —
None.
-
__loader__ -
Загрузчик, загрузивший модуль. По умолчанию —
None.Этот атрибут должен соответствовать
importlib.machinery.ModuleSpec.loader, сохранённому в объекте__spec__.Примечание
В будущей версии Python этот атрибут может перестать задаваться по умолчанию. Чтобы избежать проблем из-за такого возможного изменения, предпочтительно обращаться к атрибуту
__spec__или использоватьgetattr(module, "__loader__", None), если вам явно необходимо обратиться к этому атрибуту.Изменено в версии 3.4: По умолчанию —
None. Ранее атрибут был необязательным.
-
__name__ -
Имя модуля. Должно соответствовать
importlib.machinery.ModuleSpec.name.
-
__package__ -
Пакет, к которому относится модуль. Если модуль является модулем верхнего уровня (то есть не входит ни в один конкретный пакет), атрибут должен иметь значение
''; в противном случае ему следует присвоить имя пакета (это может быть__name__, если сам модуль является пакетом). По умолчанию —None.Этот атрибут должен соответствовать
importlib.machinery.ModuleSpec.parent, сохранённому в объекте__spec__.Примечание
В будущей версии Python этот атрибут может перестать задаваться по умолчанию. Чтобы избежать проблем из-за такого возможного изменения, предпочтительно обращаться к атрибуту
__spec__или использоватьgetattr(module, "__package__", None), если вам явно необходимо обратиться к этому атрибуту.Изменено в версии 3.4: По умолчанию —
None. Ранее атрибут был необязательным.
-
__spec__ -
Запись о состоянии модуля, связанном с системой импорта. Ожидается, что это будет экземпляр
importlib.machinery.ModuleSpec.Добавлено в версии 3.4.
-
-
types.EllipsisType -
Тип значения
Ellipsis.Добавлено в версии 3.10.
-
class types.GenericAlias(t_origin, t_args) -
Тип параметризованных обобщённых типов, таких как
list[int].t_originдолжен быть непараметризованным обобщённым классом, напримерlist,tupleилиdict.t_argsдолжен бытьtuple(возможно, состоящим из одного элемента) типов, параметризующих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: Теперь этот тип можно использовать в качестве базового класса.
См. также
- Типы обобщённых псевдонимов
-
Подробная документация об экземплярах
types.GenericAlias - PEP 585 — Обобщённые типы в стандартных коллекциях для аннотирования типов
-
Введение класса
types.GenericAlias
-
class types.UnionType -
Тип выражений объединённых типов.
Добавлено в версии 3.10.
-
class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) -
Тип объектов трассировки стека, например тех, которые содержатся в
sys.exception().__traceback__.Подробные сведения о доступных атрибутах и операциях, а также рекомендации по динамическому созданию объектов трассировки стека см. в справочнике по языку.
-
types.FrameType -
Тип объектов кадров, например тех, которые содержатся в
tb.tb_frame, еслиtbявляется объектом трассировки стека.
-
types.GetSetDescriptorType -
Тип объектов, определённых в модулях расширения с помощью
PyGetSetDef, напримерFrameType.f_localsилиarray.array.typecode. Этот тип используется как дескриптор атрибутов объектов; он выполняет ту же функцию, что и типproperty, но для классов, определённых в модулях расширения.
-
types.MemberDescriptorType -
Тип объектов, определённых в модулях расширения с помощью
PyMemberDef, напримерdatetime.timedelta.days. Этот тип используется как дескриптор простых членов данных на C, для которых применяются стандартные функции преобразования; он выполняет ту же функцию, что и типproperty, но для классов, определённых в модулях расширения.Кроме того, если класс определён с атрибутом
__slots__, для каждого слота в класс будет добавлен экземплярMemberDescriptorTypeв качестве атрибута. Благодаря этому слот отображается в__dict__класса.Особенность реализации CPython: В других реализациях Python этот тип может совпадать с
GetSetDescriptorType.
-
class types.MappingProxyType(mapping) -
Прокси отображения, доступный только для чтения. Он предоставляет динамическое представление элементов отображения: при изменении отображения это представление также обновляется.
Добавлено в версии 3.3.
Изменено в версии 3.9: Добавлена поддержка нового оператора объединения (
|) из PEP 584, который просто делегирует операцию нижележащему отображению.- key in proxy
-
Возвращает
True, если нижележащее отображение содержит ключ key, иначе —False.
- proxy[key]
-
Возвращает элемент нижележащего отображения с ключом key. Если key отсутствует в нижележащем отображении, вызывает исключение
KeyError.
- iter(proxy)
-
Возвращает итератор по ключам нижележащего отображения. Это сокращённая форма записи
iter(proxy.keys()).
- len(proxy)
-
Возвращает количество элементов в нижележащем отображении.
-
copy() -
Возвращает поверхностную копию нижележащего отображения.
-
get(key[, default]) -
Возвращает значение для key, если key присутствует в нижележащем отображении, иначе — default. Если default не указан, по умолчанию используется
None, поэтому этот метод никогда не вызывает исключениеKeyError.
-
items() -
Возвращает новое представление элементов нижележащего отображения (пары
(key, value)).
-
keys() -
Возвращает новое представление ключей нижележащего отображения.
-
values() -
Возвращает новое представление значений нижележащего отображения.
- reversed(proxy)
-
Возвращает обратный итератор по ключам нижележащего отображения.
Добавлено в версии 3.9.
Дополнительные вспомогательные классы и функции
-
class types.SimpleNamespace -
Простой подкласс
object, который обеспечивает доступ к пространству имён через атрибуты и предоставляет содержательное строковое представление.В отличие от
object, с помощьюSimpleNamespaceможно добавлять и удалять атрибуты. Если объектSimpleNamespaceинициализирован именованными аргументами, они непосредственно добавляются в нижележащее пространство имён.Этот тип примерно эквивалентен следующему коду:
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 NotImplementedSimpleNamespaceможет быть полезен в качестве замены для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) -
Эта функция преобразует функцию-генератор в функцию-корутину, возвращающую корутину на основе генератора. Такая корутина по-прежнему является итератором-генератором, но также считается объектом корутины и является ожидаемым объектом. Однако у неё не обязательно должен быть метод
__await__().Если gen_func является функцией-генератором, она изменяется на месте.
Если gen_func не является функцией-генератором, она оборачивается. Если функция возвращает экземпляр
collections.abc.Generator, этот экземпляр оборачивается в прокси-объект ожидаемого объекта. Объекты всех остальных типов возвращаются без изменений.Добавлено в версии 3.5.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/types.html