Spec-Zone.ru › Python 3.13

reprlib — альтернативная реализация repr()

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

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

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

class reprlib.Repr(*, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)

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

Именованные аргументы конструктора можно использовать как сокращённый способ задать атрибуты экземпляра Repr. Это означает, что следующая инициализация:

aRepr = reprlib.Repr(maxlevel=3)

Эквивалентна следующей:

aRepr = reprlib.Repr()
aRepr.maxlevel = 3

Дополнительную информацию об атрибутах Repr см. в разделе Объекты Repr.

Изменено в версии 3.12: Добавлена возможность задавать атрибуты с помощью именованных аргументов.

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

Эта строка отображается для рекурсивных ссылок. По умолчанию используется ....

Добавлено в версии 3.11.

Repr.maxlevel

Ограничение глубины при создании рекурсивных представлений. По умолчанию используется 6.

Repr.maxdict
Repr.maxlist
Repr.maxtuple
Repr.maxset
Repr.maxfrozenset
Repr.maxdeque
Repr.maxarray

Ограничения на количество элементов, отображаемых для указанного типа объекта. По умолчанию для maxdict используется 4, для maxarray — 5, а для остальных — 6.

Repr.maxlong

Максимальное количество символов в представлении целого числа. Цифры удаляются из середины. По умолчанию используется 40.

Repr.maxstring

Ограничение на количество символов в представлении строки. Обратите внимание, что в качестве источника символов используется «обычное» представление строки: если в представлении необходимы escape-последовательности, при сокращении представления они могут быть искажены. По умолчанию используется 30.

Repr.maxother

Это ограничение используется для управления размером представлений типов объектов, для которых у объекта Repr нет специального метода форматирования. Оно применяется аналогично атрибуту maxstring. По умолчанию используется 20.

Repr.indent

Если этому атрибуту присвоено значение None (по умолчанию), вывод форматируется без разрывов строк и отступов, как в стандартной функции repr(). Например:

>>> example = [
...     1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham']
>>> import reprlib
>>> aRepr = reprlib.Repr()
>>> print(aRepr.repr(example))
[1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham']

Если атрибуту indent присвоена строка, каждый уровень рекурсии выводится на отдельной строке с отступом, заданным этой строкой:

>>> aRepr.indent = '-->'
>>> print(aRepr.repr(example))
[
-->1,
-->'spam',
-->{
-->-->'a': 2,
-->-->'b': 'spam eggs',
-->-->'c': {
-->-->-->3: 4.5,
-->-->-->6: [],
-->-->},
-->},
-->'ham',
]

Если атрибуту indent присвоено положительное целое число, результат будет таким же, как если бы ему присвоили строку из соответствующего количества пробелов:

>>> aRepr.indent = 4
>>> print(aRepr.repr(example))
[
    1,
    'spam',
    {
        'a': 2,
        'b': 'spam eggs',
        'c': {
            3: 4.5,
            6: [],
        },
    },
    'ham',
]

Добавлено в версии 3.12.

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>'
<stdin>

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

Spec-Zone.ru

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