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

---

# 8.11. [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) – Форматирование данных

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

---

Модуль [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) предоставляет возможность красиво форматировать («pretty-print») произвольные структуры данных Python в форме, которую можно использовать как ввод в интерпретатор. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может оказаться непригодным для загрузки. Это может произойти, если в них включены такие объекты, как файлы, сокеты или классы, а также многие другие объекты, которые нельзя представить в виде литералов Python.

Форматированное представление размещает объекты на одной строке, если возможно, и переносит их на несколько строк, если они не помещаются в заданную ширину. Создавайте объекты [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) явно, если требуется изменить ограничение по ширине.

Перед выводом словари сортируются по ключам.

Модуль [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) определяет один класс:

#### `class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False)`

Создание экземпляра [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter). Конструктор принимает несколько именованных параметров. Выходной поток данных можно задать с помощью ключевого слова *stream*; единственный используемый метод объекта потока данных – метод `write()` файлового протокола. Если поток данных не указан, [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) использует `sys.stdout`. Величина отступа, добавляемого на каждом рекурсивном уровне, задаётся параметром *indent*; по умолчанию – один. Другие значения могут сделать вывод немного необычным, но могут облегчить визуальное восприятие вложенности. Количество уровней, которые могут быть напечатаны, ограничивается параметром *depth*; если печатаемая структура данных слишком глубока, следующий вложенный уровень заменяется на `...`. По умолчанию глубина форматируемых объектов не ограничена. Требуемая ширина вывода задаётся параметром *width*; по умолчанию – 80 символов. Если структуру невозможно отформатировать в заданной ширине, будет предпринята максимально возможная попытка. Если *compact* равен false (по умолчанию), каждый элемент длинной последовательности будет отформатирован на отдельной строке. Если *compact* равен true, на каждой строке вывода будет помещено максимальное количество элементов, помещающихся в заданную *width*.

Изменено в версии 3.4: Добавлен параметр *compact*.

```python
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff[:])
>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(stuff)
[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
    'spam',
    'eggs',
    'lumberjack',
    'knights',
    'ni']
>>> pp = pprint.PrettyPrinter(width=41, compact=True)
>>> pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
  'knights', 'ni'],
 'spam', 'eggs', 'lumberjack', 'knights',
 'ni']
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> pp = pprint.PrettyPrinter(depth=6)
>>> pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
```

Модуль [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) также предоставляет несколько функций для быстрого доступа:

#### `pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)`

Возвращает отформатированное представление *object* в виде строки. Параметры *indent*, *width*, *depth* и *compact* передаются конструктору [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.

Изменено в версии 3.4: Добавлен параметр *compact*.

#### `pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)`

Выводит отформатированное представление *object* в поток данных *поток данных*, завершая переводом строки. Если *поток данных* равен `None`, используется `sys.stdout`. Эту функцию можно использовать в интерактивном интерпретаторе вместо функции [`print()`](https://python-all.ru/3.4/library/functions.html#print) для просмотра значений (можно даже переназначить `print = pprint.pprint` для использования в области видимости). Параметры *indent*, *width*, *depth* и *compact* передаются конструктору [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.

Изменено в версии 3.4: Добавлен параметр *compact*.

```python
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff)
>>> pprint.pprint(stuff)
[<Recursion on list with id=...>,
 'spam',
 'eggs',
 'lumberjack',
 'knights',
 'ni']
```

#### `pprint.isreadable(object)`

Определяет, является ли отформатированное представление *object* «читаемым» (readable) или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.4/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.

```python
>>> pprint.isreadable(stuff)
False
```

#### `pprint.isrecursive(object)`

Определяет, требует ли объект *object* рекурсивного представления.

Также определена ещё одна вспомогательная функция:

#### `pprint.saferepr(object)`

Возвращает строковое представление *object*, защищённое от рекурсивных структур данных. Если представление *object* содержит рекурсивную ссылку, она будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.

```python
>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
```

## 8.11.1. Объекты PrettyPrinter

Экземпляры [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:

#### `PrettyPrinter.pformat(object)`

Возвращает отформатированное представление *object*. Учитываются параметры, переданные конструктору [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter).

#### `PrettyPrinter.pprint(object)`

Выводит отформатированное представление *object* в настроенный поток, после чего добавляет новую строку.

Следующие методы предоставляют реализации соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, так как не требуется создавать новые объекты [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter).

#### `PrettyPrinter.isreadable(object)`

Определяет, является ли отформатированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.4/library/functions.html#eval). Обратите внимание: для рекурсивных объектов возвращается `False`. Если задан параметр *depth* объекта [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) и объект глубже допустимого, возвращается `False`.

#### `PrettyPrinter.isrecursive(object)`

Определяет, требует ли объект рекурсивного представления.

Этот метод предоставляется как перехватчик (hook), позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/3.4/library/pprint.html#pprint.saferepr).

#### `PrettyPrinter.format(object, context, maxlevels, level)`

Возвращает три значения: отформатированную версию *object* в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, который содержит [`id()`](https://python-all.ru/3.4/library/functions.html#id) объектов, являющихся частью текущего контекста представления (прямые и косвенные контейнеры для *object*, влияющие на представление), в качестве ключей; если нужно представить объект, который уже присутствует в *context*, третье возвращаемое значение должно быть `True`. Рекурсивные вызовы метода [`format()`](https://python-all.ru/3.4/library/functions.html#format) должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, *maxlevels*, задаёт запрошенное ограничение на рекурсию; если ограничения нет, он равен `0`. Этот аргумент следует передавать в рекурсивные вызовы без изменений. Четвёртый аргумент, *level*, задаёт текущий уровень; рекурсивным вызовам следует передавать значение меньше текущего.

## 8.11.2. Пример

Чтобы продемонстрировать несколько вариантов использования функции [`pprint()`](https://python-all.ru/3.4/library/pprint.html#module-pprint) и её параметров, получим информацию о проекте из [PyPI](https://python-all.ru/3.4/library/pprint.html):

```python
>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('http://pypi.python.org/pypi/Twisted/json') as url:
...     http_info = url.info()
...     raw_data = url.read().decode(http_info.get_content_charset())
>>> project_info = json.loads(raw_data)
```

В базовом виде [`pprint()`](https://python-all.ru/3.4/library/pprint.html#module-pprint) отображает весь объект:

```python
>>> pprint.pprint(project_info)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': ['Programming Language :: Python :: 2.6',
                          'Programming Language :: Python :: 2.7',
                          'Programming Language :: Python :: 2 :: Only'],
          'description': 'An extensible framework for Python programming, '
                         'with special focus\r\n'
                         'on event-based network programming and '
                         'multiprotocol integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking framework written in Python',
          'version': '12.3.0'},
 'urls': [{'comment_text': '',
           'downloads': 71844,
           'filename': 'Twisted-12.3.0.tar.bz2',
           'has_sig': False,
           'md5_digest': '6e289825f3bf5591cfd670874cc0862d',
           'packagetype': 'sdist',
           'python_version': 'source',
           'size': 2615733,
           'upload_time': '2012-12-26T12:47:03',
           'url': 'https://pypi.python.org/packages/source/T/Twisted/Twisted-12.3.0.tar.bz2'},
          {'comment_text': '',
           'downloads': 5224,
           'filename': 'Twisted-12.3.0.win32-py2.7.msi',
           'has_sig': False,
           'md5_digest': '6b778f5201b622a5519a2aca1a2fe512',
           'packagetype': 'bdist_msi',
           'python_version': '2.7',
           'size': 2916352,
           'upload_time': '2012-12-26T12:48:15',
           'url': 'https://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.3.0.win32-py2.7.msi'}]}
```

Результат можно ограничить определённой *depth* (для более глубокого содержимого используется многоточие):

```python
>>> pprint.pprint(project_info, depth=2)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': [...],
          'description': 'An extensible framework for Python programming, '
                         'with special focus\r\n'
                         'on event-based network programming and '
                         'multiprotocol integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking framework written in Python',
          'version': '12.3.0'},
 'urls': [{...}, {...}]}
```

Кроме того, можно указать максимальную ширину *width*. Если длинный объект невозможно разбить, указанная ширина будет превышена:

```python
>>> pprint.pprint(project_info, depth=2, width=50)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': [...],
          'description': 'An extensible '
                         'framework for '
                         'Python programming, '
                         'with special '
                         'focus\r\n'
                         'on event-based '
                         'network programming '
                         'and multiprotocol '
                         'integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous '
                     'networking framework '
                     'written in Python',
          'version': '12.3.0'},
 'urls': [{...}, {...}]}
```
