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

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

Repr.maxlong

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

Repr.maxstring

Ограничение на количество символов в представлении строки. Обратите внимание, что для получения исходных символов используется «нормальное» представление строки: если для представления требуются управляющие последовательности, они могут быть повреждены при укорачивании представления. По умолчанию 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.13/library/reprlib.html

Spec-Zone.ru

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