> **Источник:** https://python-all.ru/3.3/library/reprlib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 8.12. [`reprlib`](https://python-all.ru/3.3/library/reprlib.html#module-reprlib) – альтернативная реализация [`repr()`](https://python-all.ru/3.3/library/functions.html#repr)

**Исходный код:** [Lib/reprlib.py](https://python-all.ru/src/3.3/Lib/reprlib.py)

---

Модуль [`reprlib`](https://python-all.ru/3.3/library/reprlib.html#module-reprlib) предоставляет средства для создания строковых представлений объектов с ограничением на длину результирующих строк. Он используется в отладчике Python и может быть полезен и в других контекстах.

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

#### `class reprlib.Repr`

Класс, предоставляющий средства форматирования, полезные для реализации функций, аналогичных встроенной [`repr()`](https://python-all.ru/3.3/library/functions.html#repr); для разных типов объектов добавляются ограничения на размер, чтобы избежать создания слишком длинных представлений.

#### `reprlib.aRepr`

Это экземпляр [`Repr`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr), который используется для предоставления функции [`repr()`](https://python-all.ru/3.3/library/reprlib.html#reprlib.repr), описанной ниже. Изменение атрибутов этого объекта повлияет на ограничения размера, используемые [`repr()`](https://python-all.ru/3.3/library/reprlib.html#reprlib.repr) и отладчиком Python.

#### `reprlib.repr(obj)`

Это метод [`repr()`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.repr) объекта `aRepr`. Он возвращает строку, аналогичную возвращаемой одноимённой встроенной функцией, но с ограничениями на большинство размеров.

В дополнение к инструментам ограничения размера, модуль также предоставляет декоратор для обнаружения рекурсивных вызовов [`__repr__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__repr__) и подстановки вместо них строки-заполнителя.

#### `@reprlib.recursive_repr(fillvalue="...")`

Декоратор для методов [`__repr__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__repr__), предназначенный для обнаружения рекурсивных вызовов в пределах одного потока. Если происходит рекурсивный вызов, возвращается *fillvalue*, в противном случае производится обычный вызов [`__repr__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__repr__). Например:

```python
>>> 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.

## 8.12.1. Объекты Repr

Экземпляры [`Repr`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr) предоставляют несколько атрибутов, которые можно использовать для задания ограничений размера представлений разных типов объектов, а также методы, которые форматируют определённые типы объектов.

#### `Repr.maxlevel`

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

#### `Repr.maxdict`

#### `Repr.maxlist`

#### `Repr.maxtuple`

#### `Repr.maxset`

#### `Repr.maxfrozenset`

#### `Repr.maxdeque`

#### `Repr.maxarray`

Ограничения на количество отображаемых элементов для указанного типа объекта. По умолчанию `4` для [`maxdict`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.maxdict), `5` для [`maxarray`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.maxarray) и `6` для остальных.

#### `Repr.maxlong`

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

#### `Repr.maxstring`

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

#### `Repr.maxother`

Этот предел используется для контроля размера типов объектов, для которых в объекте [`Repr`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr) нет специального метода форматирования. Он применяется аналогично [`maxstring`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.maxstring). По умолчанию – `20`.

#### `Repr.repr(obj)`

Эквивалент встроенной [`repr()`](https://python-all.ru/3.3/library/functions.html#repr), использующий форматирование, заданное экземпляром.

#### `Repr.repr1(obj, level)`

Рекурсивная реализация, используемая [`repr()`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.repr). Она использует тип *obj*, чтобы определить, какой метод форматирования вызвать, передавая ему *obj* и *level*. Методы для конкретных типов должны вызывать [`repr1()`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.repr1) для выполнения рекурсивного форматирования, с `level - 1` в качестве значения *level* при рекурсивном вызове.

#### `Repr.repr_TYPE(obj, level)`

Методы форматирования для конкретных типов реализованы как методы с именем на основе имени типа. В имени метода **TYPE** заменяется на `string.join(string.split(type(obj).__name__, '_'))`. Вызов этих методов обрабатывается методом `repr1()`. Методы для конкретных типов, которым нужно рекурсивно форматировать значение, должны вызывать `self.repr1(subobj, level - 1)`.

## 8.12.2. Наследование Repr Objects

Использование динамической диспетчеризации через [`Repr.repr1()`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr.repr1) позволяет подклассам [`Repr`](https://python-all.ru/3.3/library/reprlib.html#reprlib.Repr) добавлять поддержку дополнительных встроенных типов объектов или изменять обработку уже поддерживаемых типов. В следующем примере показано, как можно добавить специальную поддержку для файловых объектов:

```python
import reprlib
import sys

class MyRepr(reprlib.Repr):
    def repr_file(self, obj, level):
        if obj.name in ['<stdin>', '<stdout>', '<stderr>']:
            return obj.name
        else:
            return repr(obj)

aRepr = MyRepr()
print(aRepr.repr(sys.stdin))         # печатает '<stdin>'
```
