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

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

Примечание

Модуль repr был переименован в reprlib в Python 3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании исходных кодов в Python 3.

Исходный код: Lib/repr.py


Модуль repr предоставляет средства для создания представлений объектов с ограничением на длину результирующих строк. Он используется в отладчике Python и может быть полезен и в других контекстах.

Этот модуль предоставляет класс, экземпляр и функцию:

class repr.Repr

Класс предоставляет средства форматирования для реализации функций, подобных встроенной repr(); для разных типов объектов устанавливаются пределы размера, чтобы не допускать генерации слишком длинных представлений.

repr.aRepr

Это экземпляр Repr, используемый для предоставления функции repr(), описанной ниже. Изменение атрибутов этого объекта повлияет на ограничения размера, используемые repr() и отладчиком Python.

repr.repr(obj)

Это метод repr() класса aRepr. Он возвращает строку, аналогичную возвращаемой встроенной функцией с тем же именем, но с ограничениями на большинство размеров.

8.19.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 для остальных.

Новое в версии 2.4: maxset, maxfrozenset и set.

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.19.2. Наследование объектов ReprSubclassing Repr Objects

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

import repr as 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>'