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