Spec-Zone.ru › Python 3.5

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

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

1. Объекты 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).

2. Наследование от объектов 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>'

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/reprlib.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API