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.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

Ограничение на количество символов в представлении строки. Обратите внимание, что в качестве источника символов используется «обычное» представление строки: если в представлении необходимы управляющие последовательности, они могут быть искажены при сокращении представления. Значение по умолчанию равно 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)

Методы форматирования для определенных типов реализуются в виде методов с именем, основанным на имени типа. В названии метода ТИП заменяется на '_'.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>
Вернуться на верх