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__() для обнаружения рекурсивных вызовов в пределах одного потока. Если выполняется рекурсивный вызов, возвращается значение файла, в противном случае выполняется обычный вызов __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>'
Вернуться на верх