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

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

Методы форматирования для конкретных типов реализуются как методы с именем, основанным на имени типа. В имени метода 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