reprlib — Альтернативная реализация repr()
Исходный код: Lib/reprlib.py
Модуль reprlib предоставляет средства для создания представлений объектов с ограничениями на размер результирующих строк. Это используется в отладчике Python и может быть полезным в других контекстах.
Этот модуль предоставляет класс, экземпляр и функцию:
-
class reprlib.Repr -
Класс, предоставляющий сервисы форматирования, полезные при реализации функций, аналогичных встроенной функции
repr(); ограничения размера для различных типов объектов добавляются для предотвращения создания чрезмерно длинных представлений.
-
reprlib.aRepr -
Это экземпляр
Repr, который используется для предоставления функцииrepr(), описанной ниже. Изменение атрибутов этого объекта повлияет на ограничения размера, используемые функциейrepr()и отладчиком Python.
-
reprlib.repr(obj) -
Это метод
repr()объектаaRepr. Он возвращает строку, аналогичную строке, возвращаемой встроенной функцией с тем же именем, но с ограничениями на большинство размеров.
Помимо инструментов ограничения размера, модуль также предоставляет декоратор для обнаружения рекурсивных вызовов к методу __repr__() и подстановки строки-заполнителя вместо него.
-
@reprlib.recursive_repr(fillvalue="...") -
Декоратор для методов
__repr__()для обнаружения рекурсивных вызовов в рамках одного потока. Если рекурсивный вызов происходит, возвращается fillvalue, в противном случае выполняется обычный вызов__repr__(). Например:>>> from reprlib import recursive_repr >>> class MyList(list): ... @recursive_repr() ... def __repr__(self): ... return '<' + '|'.join(map(repr, self)) + '>' ... >>> m = MyList('abc') >>> m.append(m) >>> m.append('x') >>> print(m) <'a'|'b'|'c'|...|'x'>Введено в версии 3.2.
Объекты Repr
Экземпляры Repr предоставляют несколько атрибутов, которые могут использоваться для ограничения размера представлений различных типов объектов, и методы, которые форматируют конкретные типы объектов.
-
Repr.maxlevel -
Предел глубины при создании рекурсивных представлений. По умолчанию
6.
-
Repr.maxdict -
Repr.maxlist -
Repr.maxtuple -
Repr.maxset -
Repr.maxfrozenset -
Repr.maxdeque -
Repr.maxarray -
Ограничения на количество элементов, представленных для указанного типа объекта. По умолчанию
4дляmaxdict,5дляmaxarrayи6для других.
-
Repr.maxlong -
Максимальное количество символов в представлении целого числа. Цифры из середины опускаются. По умолчанию
40.
-
Repr.maxstring -
Ограничение на количество символов в представлении строки. Обратите внимание, что используется «обычное» представление строки как источник символов: если для представления нужны escape-последовательности, они могут быть искажены при сокращении представления. По умолчанию
30.
-
Repr.maxother -
Это ограничение используется для управления размером типов объектов, для которых нет специального метода форматирования в объекте
Repr. Оно применяется аналогичноmaxstring. По умолчанию20.
-
Repr.repr(obj) -
Эквивалент встроенной функции
repr(), использующий форматирование, заданное экземпляром.
-
Repr.repr1(obj, level) -
Рекурсивная реализация, используемая методом
repr(). Использует тип obj для определения вызываемого метода форматирования, передавая ему obj и level. Специальные методы для типов должны вызыватьrepr1()для рекурсивного форматирования, используяlevel - 1в качестве значения level в рекурсивном вызове.
-
Repr.repr_TYPE(obj, level) -
Методы форматирования для конкретных типов реализуются как методы с именем, основанным на имени типа. В имени метода TYPE заменяется на
'_'.join(type(obj).__name__.split()). Передача управления этим методам осуществляется методомrepr1(). Специальные методы для типов, которые нуждаются в рекурсивном форматировании значения, должны вызыватьself.repr1(subobj, level - 1).
Наследование от объектов Repr
Использование динамической диспетчеризации в методе Repr.repr1() позволяет подклассам Repr добавлять поддержку дополнительных встроенных типов объектов или изменять обработку уже поддерживаемых типов. Этот пример показывает, как можно добавить специальную поддержку для объектов типа файл:
import reprlib
import sys
class MyRepr(reprlib.Repr):
def repr_TextIOWrapper(self, obj, level):
if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
return obj.name
return repr(obj)
aRepr = MyRepr()
print(aRepr.repr(sys.stdin)) # prints '<stdin>'
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/reprlib.html