Spec-Zone.ru › Python 3.14

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

Ограничения на число элементов, отображаемых для указанного типа объекта. Значение по умолчанию — 4 для maxdict, 5 для maxarray и 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)

Методы форматирования для конкретных типов реализуются как методы, имена которых образованы на основе названия типа. В имени метода '_'.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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/reprlib.html

Spec-Zone.ru

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