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

8.12. 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__(). Например:

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

8.12.1. Объекты ReprRepr Objects

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

Ограничение на количество символов в строковом представлении строки. Обратите внимание, что в качестве источника символов используется «обычное» строковое представление: если в представлении нужны 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 заменяется на string.join(string.split(type(obj).__name__, '_')). Вызов этих методов обрабатывается методом repr1(). Методы для конкретных типов, которым нужно рекурсивно форматировать значение, должны вызывать self.repr1(subobj, level - 1).

8.12.2. Наследование Repr ObjectsSubclassing Repr Objects

Использование динамической диспетчеризации через Repr.repr1() позволяет подклассам Repr добавлять поддержку дополнительных встроенных типов объектов или изменять обработку уже поддерживаемых типов. В следующем примере показано, как можно добавить специальную поддержку для файловых объектов:

import reprlib
import sys

class MyRepr(reprlib.Repr):
    def repr_file(self, obj, level):
        if obj.name in ['<stdin>', '<stdout>', '<stderr>']:
            return obj.name
        else:
            return repr(obj)

aRepr = MyRepr()
print(aRepr.repr(sys.stdin))         # печатает '<stdin>'