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

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

Подклассирование объектов восстановления

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