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__(). Например:>>> 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.
1. Объекты 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 -
Ограничение на количество символов в представлении строки. Обратите внимание, что используется «обычное» представление строки в качестве источника символов: если для представления требуются управляющие последовательности, они могут быть искажены при сокращении представления. По умолчанию
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).
2. Наследование от объектов 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/reprlib.html