Spec-Zone.ru › Python 3.12

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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/reprlib.html

Spec-Zone.ru

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