Документация Python неофициальный перевод
Содержание страницы

reprlib – альтернативная реализация repr()reprlib – Alternate repr() implementation

Исходный код: 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.

Объекты ReprRepr Objects

Экземпляры 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).

Создание подклассов объектов ReprSubclassing Repr Objects

Использование динамической диспетчеризации в 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))         # печатает '<stdin>'
<stdin>