pprint.md
1> **Источник:** https://python-all.ru/2.7/library/pprint.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.18. [`pprint`](https://python-all.ru/2.7/library/pprint.html#module-pprint) – средство форматированного вывода данных89**Исходный код:** [Lib/pprint.py](https://python-all.ru/src/2.7/Lib/pprint.py)1011---1213Модуль [`pprint`](https://python-all.ru/2.7/library/pprint.html#module-pprint) предоставляет возможность «pretty-печати» произвольных структур данных Python в форме, которая может использоваться как входные данные для интерпретатора. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может не загружаться. Это может быть в случае, если включены такие объекты, как файлы, сокеты, классы или экземпляры, а также многие другие встроенные объекты, которые не представимы в виде констант Python.1415Форматированное представление помещает объекты на одну строку, если возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину. Для изменения ограничения по ширине создавайте объекты [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) явно.1617Изменено в версии 2.5: Словари сортируются по ключу перед вычислением отображения; до версии 2.5 словарь сортировался, только если его отображение требовало более одной строки, хотя это не было задокументировано.1819Изменено в версии 2.6: Добавлена поддержка [`set`](https://python-all.ru/2.7/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/2.7/library/stdtypes.html#frozenset).2021Модуль [`pprint`](https://python-all.ru/2.7/library/pprint.html#module-pprint) определяет один класс:2223#### `class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None)`2425Создаёт экземпляр [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter). Данный конструктор принимает несколько именованных параметров. Выходной поток может быть задан с помощью параметра *stream*; единственным используемым методом объекта потока является метод `write()` протокола файлов. Если не указано, [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) использует `sys.stdout`. Три дополнительных параметра могут использоваться для управления форматированным представлением. Это ключевые слова *indent*, *depth* и *width*. Величина отступа, добавляемого на каждый рекурсивный уровень, задаётся параметром *indent*; по умолчанию он равен единице. Другие значения могут сделать вывод немного необычным, но могут облегчить выявление вложенности. Количество уровней, которые могут быть напечатаны, контролируется параметром *depth*; если структура данных слишком глубока, следующий вложенный уровень заменяется на `...`. По умолчанию глубина форматируемых объектов не ограничена. Желаемая ширина вывода ограничивается параметром *width*; по умолчанию 80 символов. Если структура не может быть отформатирована в пределах заданной ширины, будет предпринята наилучшая попытка.2627```python28>>> import pprint29>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']30>>> stuff.insert(0, stuff[:])31>>> pp = pprint.PrettyPrinter(indent=4)32>>> pp.pprint(stuff)33[ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],34 'spam',35 'eggs',36 'lumberjack',37 'knights',38 'ni']39>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',40... ('parrot', ('fresh fruit',))))))))41>>> pp = pprint.PrettyPrinter(depth=6)42>>> pp.pprint(tup)43('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))44```4546Класс [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) поддерживает несколько производных функций:4748#### `pprint.pformat(object, indent=1, width=80, depth=None)`4950Возвращает отформатированное представление *object* в виде строки. Параметры *indent*, *width* и *depth* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.5152Изменено в версии 2.4: Параметры *indent*, *width* и *depth* были добавлены.5354#### `pprint.pprint(object, stream=None, indent=1, width=80, depth=None)`5556Печатает отформатированное представление *object* в поток данных *stream*, после чего добавляет новую строку. Если поток данных *stream* равен `None`, используется `sys.stdout`. Это может использоваться в интерактивном интерпретаторе вместо оператора [`print`](https://python-all.ru/2.7/reference/simple_stmts.html#print) для просмотра значений. Параметры *indent*, *width* и *depth* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.5758```python59>>> import pprint60>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']61>>> stuff.insert(0, stuff)62>>> pprint.pprint(stuff)63[<Recursion on list with id=...>,64 'spam',65 'eggs',66 'lumberjack',67 'knights',68 'ni']69```7071Изменено в версии 2.4: Параметры *indent*, *width* и *depth* были добавлены.7273#### `pprint.isreadable(object)`7475Определяет, является ли форматированное представление *object* «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/2.7/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.7677```python78>>> pprint.isreadable(stuff)79False80```8182#### `pprint.isrecursive(object)`8384Определяет, требует ли объект *object* рекурсивного представления.8586Также определена ещё одна вспомогательная функция:8788#### `pprint.saferepr(object)`8990Возвращает строковое представление объекта *object*, защищённое от рекурсивных структур данных. Если представление *object* обнаруживает рекурсивную запись, рекурсивная ссылка будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.9192```python93>>> pprint.saferepr(stuff)94"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"95```9697## 8.18.1. Объекты PrettyPrinter9899Экземпляры [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:100101#### `PrettyPrinter.pformat(object)`102103Возвращает отформатированное представление *object*. Учитываются параметры, переданные конструктору [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter).104105#### `PrettyPrinter.pprint(object)`106107Выводит отформатированное представление *object* в настроенный поток, после чего добавляет новую строку.108109Следующие методы предоставляют реализации для соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, поскольку не нужно создавать новые объекты [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter).110111#### `PrettyPrinter.isreadable(object)`112113Определяет, является ли форматированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/2.7/library/functions.html#eval). Обратите внимание: для рекурсивных объектов возвращается `False`. Если установлен параметр *depth* в [`PrettyPrinter`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter) и объект глубже допустимого, возвращается `False`.114115#### `PrettyPrinter.isrecursive(object)`116117Определяет, требует ли объект рекурсивного представления.118119Этот метод предоставляется как хук, позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/2.7/library/pprint.html#pprint.saferepr).120121#### `PrettyPrinter.format(object, context, maxlevels, level)`122123Возвращает три значения: форматированную версию *object* в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, содержащий [`id()`](https://python-all.ru/2.7/library/functions.html#id) объектов, которые являются частью текущего контекста представления (прямые и косвенные контейнеры для *object*, влияющие на представление) в качестве ключей; если необходимо отобразить объект, который уже представлен в *context*, третье возвращаемое значение должно быть `True`. Рекурсивные вызовы метода [`format()`](https://python-all.ru/2.7/library/pprint.html#pprint.PrettyPrinter.format) должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, *maxlevels*, задаёт запрошенный лимит рекурсии; он будет равен `0`, если лимит не задан. Этот аргумент должен передаваться рекурсивным вызовам без изменений. Четвёртый аргумент, *level*, указывает текущий уровень; рекурсивные вызовы должны получать значение, меньшее текущего.124125Новое в версии 2.3.126127## 8.18.2. Пример pprint128129Этот пример демонстрирует несколько вариантов использования функции [`pprint()`](https://python-all.ru/2.7/library/pprint.html#module-pprint) и её параметров.130131```python132>>> import pprint133>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',134... ('parrot', ('fresh fruit',))))))))135>>> stuff = ['a' * 10, tup, ['a' * 30, 'b' * 30], ['c' * 20, 'd' * 20]]136>>> pprint.pprint(stuff)137['aaaaaaaaaa',138 ('spam',139 ('eggs',140 ('lumberjack',141 ('knights', ('ni', ('dead', ('parrot', ('fresh fruit',)))))))),142 ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],143 ['cccccccccccccccccccc', 'dddddddddddddddddddd']]144>>> pprint.pprint(stuff, depth=3)145['aaaaaaaaaa',146 ('spam', ('eggs', (...))),147 ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],148 ['cccccccccccccccccccc', 'dddddddddddddddddddd']]149>>> pprint.pprint(stuff, width=60)150['aaaaaaaaaa',151 ('spam',152 ('eggs',153 ('lumberjack',154 ('knights',155 ('ni', ('dead', ('parrot', ('fresh fruit',)))))))),156 ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',157 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],158 ['cccccccccccccccccccc', 'dddddddddddddddddddd']]159```160