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.fillvalue -
Эта строка отображается для рекурсивных ссылок. По умолчанию она равна
....Введено в версии 3.11.
-
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>'
<stdin>
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/reprlib.html