Spec-Zone.ru › Python 3.9

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

Использование динамической диспетчеризации в методе 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/reprlib.html

Spec-Zone.ru

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