Spec-Zone.ru › Python 3.6

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.

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

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

8.12.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.6/library/reprlib.html

Spec-Zone.ru

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