pprint.md
1> **Источник:** https://python-all.ru/3.4/library/pprint.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.11. [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) – Форматирование данных89**Исходный код:** [Lib/pprint.py](https://python-all.ru/src/3.4/Lib/pprint.py)1011---1213Модуль [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) предоставляет возможность красиво форматировать («pretty-print») произвольные структуры данных Python в форме, которую можно использовать как ввод в интерпретатор. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может оказаться непригодным для загрузки. Это может произойти, если в них включены такие объекты, как файлы, сокеты или классы, а также многие другие объекты, которые нельзя представить в виде литералов Python.1415Форматированное представление размещает объекты на одной строке, если возможно, и переносит их на несколько строк, если они не помещаются в заданную ширину. Создавайте объекты [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) явно, если требуется изменить ограничение по ширине.1617Перед выводом словари сортируются по ключам.1819Модуль [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) определяет один класс:2021#### `class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False)`2223Создание экземпляра [`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*.2425Изменено в версии 3.4: Добавлен параметр *compact*.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>>> pp = pprint.PrettyPrinter(width=41, compact=True)40>>> pp.pprint(stuff)41[['spam', 'eggs', 'lumberjack',42 'knights', 'ni'],43 'spam', 'eggs', 'lumberjack', 'knights',44 'ni']45>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',46... ('parrot', ('fresh fruit',))))))))47>>> pp = pprint.PrettyPrinter(depth=6)48>>> pp.pprint(tup)49('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))50```5152Модуль [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) также предоставляет несколько функций для быстрого доступа:5354#### `pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)`5556Возвращает отформатированное представление *object* в виде строки. Параметры *indent*, *width*, *depth* и *compact* передаются конструктору [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.5758Изменено в версии 3.4: Добавлен параметр *compact*.5960#### `pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)`6162Выводит отформатированное представление *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) в качестве параметров форматирования.6364Изменено в версии 3.4: Добавлен параметр *compact*.6566```python67>>> import pprint68>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']69>>> stuff.insert(0, stuff)70>>> pprint.pprint(stuff)71[<Recursion on list with id=...>,72 'spam',73 'eggs',74 'lumberjack',75 'knights',76 'ni']77```7879#### `pprint.isreadable(object)`8081Определяет, является ли отформатированное представление *object* «читаемым» (readable) или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.4/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.8283```python84>>> pprint.isreadable(stuff)85False86```8788#### `pprint.isrecursive(object)`8990Определяет, требует ли объект *object* рекурсивного представления.9192Также определена ещё одна вспомогательная функция:9394#### `pprint.saferepr(object)`9596Возвращает строковое представление *object*, защищённое от рекурсивных структур данных. Если представление *object* содержит рекурсивную ссылку, она будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.9798```python99>>> pprint.saferepr(stuff)100"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"101```102103## 8.11.1. Объекты PrettyPrinter104105Экземпляры [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:106107#### `PrettyPrinter.pformat(object)`108109Возвращает отформатированное представление *object*. Учитываются параметры, переданные конструктору [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter).110111#### `PrettyPrinter.pprint(object)`112113Выводит отформатированное представление *object* в настроенный поток, после чего добавляет новую строку.114115Следующие методы предоставляют реализации соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, так как не требуется создавать новые объекты [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter).116117#### `PrettyPrinter.isreadable(object)`118119Определяет, является ли отформатированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`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`.120121#### `PrettyPrinter.isrecursive(object)`122123Определяет, требует ли объект рекурсивного представления.124125Этот метод предоставляется как перехватчик (hook), позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/3.4/library/pprint.html#pprint.saferepr).126127#### `PrettyPrinter.format(object, context, maxlevels, level)`128129Возвращает три значения: отформатированную версию *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*, задаёт текущий уровень; рекурсивным вызовам следует передавать значение меньше текущего.130131## 8.11.2. Пример132133Чтобы продемонстрировать несколько вариантов использования функции [`pprint()`](https://python-all.ru/3.4/library/pprint.html#module-pprint) и её параметров, получим информацию о проекте из [PyPI](https://python-all.ru/3.4/library/pprint.html):134135```python136>>> import json137>>> import pprint138>>> from urllib.request import urlopen139>>> with urlopen('http://pypi.python.org/pypi/Twisted/json') as url:140... http_info = url.info()141... raw_data = url.read().decode(http_info.get_content_charset())142>>> project_info = json.loads(raw_data)143```144145В базовом виде [`pprint()`](https://python-all.ru/3.4/library/pprint.html#module-pprint) отображает весь объект:146147```python148>>> pprint.pprint(project_info)149{'info': {'_pypi_hidden': False,150 '_pypi_ordering': 125,151 'author': 'Glyph Lefkowitz',152 'author_email': 'glyph@twistedmatrix.com',153 'bugtrack_url': '',154 'cheesecake_code_kwalitee_id': None,155 'cheesecake_documentation_id': None,156 'cheesecake_installability_id': None,157 'classifiers': ['Programming Language :: Python :: 2.6',158 'Programming Language :: Python :: 2.7',159 'Programming Language :: Python :: 2 :: Only'],160 'description': 'An extensible framework for Python programming, '161 'with special focus\r\n'162 'on event-based network programming and '163 'multiprotocol integration.',164 'docs_url': '',165 'download_url': 'UNKNOWN',166 'home_page': 'http://twistedmatrix.com/',167 'keywords': '',168 'license': 'MIT',169 'maintainer': '',170 'maintainer_email': '',171 'name': 'Twisted',172 'package_url': 'http://pypi.python.org/pypi/Twisted',173 'platform': 'UNKNOWN',174 'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',175 'requires_python': None,176 'stable_version': None,177 'summary': 'An asynchronous networking framework written in Python',178 'version': '12.3.0'},179 'urls': [{'comment_text': '',180 'downloads': 71844,181 'filename': 'Twisted-12.3.0.tar.bz2',182 'has_sig': False,183 'md5_digest': '6e289825f3bf5591cfd670874cc0862d',184 'packagetype': 'sdist',185 'python_version': 'source',186 'size': 2615733,187 'upload_time': '2012-12-26T12:47:03',188 'url': 'https://pypi.python.org/packages/source/T/Twisted/Twisted-12.3.0.tar.bz2'},189 {'comment_text': '',190 'downloads': 5224,191 'filename': 'Twisted-12.3.0.win32-py2.7.msi',192 'has_sig': False,193 'md5_digest': '6b778f5201b622a5519a2aca1a2fe512',194 'packagetype': 'bdist_msi',195 'python_version': '2.7',196 'size': 2916352,197 'upload_time': '2012-12-26T12:48:15',198 'url': 'https://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.3.0.win32-py2.7.msi'}]}199```200201Результат можно ограничить определённой *depth* (для более глубокого содержимого используется многоточие):202203```python204>>> pprint.pprint(project_info, depth=2)205{'info': {'_pypi_hidden': False,206 '_pypi_ordering': 125,207 'author': 'Glyph Lefkowitz',208 'author_email': 'glyph@twistedmatrix.com',209 'bugtrack_url': '',210 'cheesecake_code_kwalitee_id': None,211 'cheesecake_documentation_id': None,212 'cheesecake_installability_id': None,213 'classifiers': [...],214 'description': 'An extensible framework for Python programming, '215 'with special focus\r\n'216 'on event-based network programming and '217 'multiprotocol integration.',218 'docs_url': '',219 'download_url': 'UNKNOWN',220 'home_page': 'http://twistedmatrix.com/',221 'keywords': '',222 'license': 'MIT',223 'maintainer': '',224 'maintainer_email': '',225 'name': 'Twisted',226 'package_url': 'http://pypi.python.org/pypi/Twisted',227 'platform': 'UNKNOWN',228 'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',229 'requires_python': None,230 'stable_version': None,231 'summary': 'An asynchronous networking framework written in Python',232 'version': '12.3.0'},233 'urls': [{...}, {...}]}234```235236Кроме того, можно указать максимальную ширину *width*. Если длинный объект невозможно разбить, указанная ширина будет превышена:237238```python239>>> pprint.pprint(project_info, depth=2, width=50)240{'info': {'_pypi_hidden': False,241 '_pypi_ordering': 125,242 'author': 'Glyph Lefkowitz',243 'author_email': 'glyph@twistedmatrix.com',244 'bugtrack_url': '',245 'cheesecake_code_kwalitee_id': None,246 'cheesecake_documentation_id': None,247 'cheesecake_installability_id': None,248 'classifiers': [...],249 'description': 'An extensible '250 'framework for '251 'Python programming, '252 'with special '253 'focus\r\n'254 'on event-based '255 'network programming '256 'and multiprotocol '257 'integration.',258 'docs_url': '',259 'download_url': 'UNKNOWN',260 'home_page': 'http://twistedmatrix.com/',261 'keywords': '',262 'license': 'MIT',263 'maintainer': '',264 'maintainer_email': '',265 'name': 'Twisted',266 'package_url': 'http://pypi.python.org/pypi/Twisted',267 'platform': 'UNKNOWN',268 'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',269 'requires_python': None,270 'stable_version': None,271 'summary': 'An asynchronous '272 'networking framework '273 'written in Python',274 'version': '12.3.0'},275 'urls': [{...}, {...}]}276```277