pprint.md
1> **Источник:** https://python-all.ru/3.13/library/pprint.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `pprint` – форматированный вывод данных89**Исходный код:** [Lib/pprint.py](https://python-all.ru/src/3.13/Lib/pprint.py)1011---1213Модуль `pprint` предоставляет возможность «форматированного вывода» произвольных структур данных Python в форме, которую можно использовать как входные данные для интерпретатора. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может оказаться незагружаемым. Так бывает, если включены объекты вроде файлов, сокетов или классов, а также многие другие объекты, которые не представимы в виде литералов Python.1415Форматированное представление помещает объекты в одну строку, если это возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину, которая настраивается с помощью параметра *width* (по умолчанию 80 символов).1617Изменено в версии 3.9: Добавлена поддержка форматированного вывода [`types.SimpleNamespace`](https://python-all.ru/3.13/library/types.html#types.SimpleNamespace).1819Изменено в версии 3.10: Добавлена поддержка форматированного вывода [`dataclasses.dataclass`](https://python-all.ru/3.13/library/dataclasses.html#dataclasses.dataclass).2021## Функции2223#### `pprint.pp(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)`2425Выводит форматированное представление *объекта* с последующим переводом строки. Эту функцию можно использовать в интерактивном интерпретаторе вместо функции [`print()`](https://python-all.ru/3.13/library/functions.html#print) для просмотра значений. Подсказка: вы можете переназначить `print = pprint.pp` для использования в пределах области видимости.2627**Параметры:**2829- **object** – Объект для вывода.30- **поток данных** ([объект, подобный файлу](https://python-all.ru/3.13/glossary.html#term-file-like-object) | None) – Объект, подобный файлу, в который будет записан вывод путём вызова его метода `write()`. Если `None` (по умолчанию), используется [`sys.stdout`](https://python-all.ru/3.13/library/sys.html#sys.stdout).31- **indent** ([*int*](https://python-all.ru/3.13/library/functions.html#int)) – Величина отступа, добавляемого для каждого уровня вложенности.32- **width** ([*int*](https://python-all.ru/3.13/library/functions.html#int)) – Желаемая максимальная длина строки в символах. Если структуру невозможно отформатировать с заданным ограничением ширины, будет предпринята попытка сделать всё возможное.33- **depth** ([*int*](https://python-all.ru/3.13/library/functions.html#int) *|* *None*) – Количество уровней вложенности, которое может быть выведено. Если выводимая структура данных слишком глубока, следующий вложенный уровень заменяется на `...`. Если `None` (по умолчанию), ограничение на глубину форматируемых объектов отсутствует.34- **compact** ([*bool*](https://python-all.ru/3.13/library/functions.html#bool)) – Управляет способом форматирования длинных [последовательностей](https://python-all.ru/3.13/glossary.html#term-sequence). Если `False` (по умолчанию), каждый элемент последовательности выводится на отдельной строке, иначе на каждой выходной строке выводится столько элементов, сколько помещается в пределах *width*.35- **sort\_dicts** ([*bool*](https://python-all.ru/3.13/library/functions.html#bool)) – Если `True`, словари будут форматироваться с сортировкой ключей, в противном случае они будут отображаться в порядке вставки (по умолчанию).36- **underscore\_numbers** ([*bool*](https://python-all.ru/3.13/library/functions.html#bool)) – Если `True`, целые числа будут форматироваться с символом `_` в качестве разделителя тысяч, в противном случае символ подчёркивания не отображается (по умолчанию).3738```python39>>> import pprint40>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']41>>> stuff.insert(0, stuff)42>>> pprint.pp(stuff)43[<Recursion on list with id=...>,44 'spam',45 'eggs',46 'lumberjack',47 'knights',48 'ni']49```5051Добавлено в версии 3.8.5253#### `pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)`5455Псевдоним для [`pp()`](https://python-all.ru/3.13/library/pprint.html#pprint.pp) с *sort\_dicts*, по умолчанию установленным в `True`, что автоматически сортирует ключи словарей. Вместо этого рекомендуется использовать `pp()`, где по умолчанию `False`.5657#### `pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)`5859Возвращает форматированное представление *object* в виде строки. Параметры *indent*, *width*, *depth*, *compact*, *sort\_dicts* и *underscore\_numbers* передаются конструктору [`PrettyPrinter`](https://python-all.ru/3.13/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования; их значения описаны в документации выше.6061#### `pprint.isreadable(object)`6263Определяет, является ли форматированное представление *object* «читаемым» или может использоваться для восстановления значения с помощью [`eval()`](https://python-all.ru/3.13/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.6465```python66>>> pprint.isreadable(stuff)67False68```6970#### `pprint.isrecursive(object)`7172Определяет, требует ли *object* рекурсивного представления. Эта функция имеет те же ограничения, что указаны в [`saferepr()`](https://python-all.ru/3.13/library/pprint.html#pprint.saferepr) ниже, и может вызывать [`RecursionError`](https://python-all.ru/3.13/library/exceptions.html#RecursionError), если не удаётся обнаружить рекурсивный объект.7374#### `pprint.saferepr(object)`7576Возвращает строковое представление *object*, защищённое от рекурсии в некоторых распространённых структурах данных, а именно экземплярах [`dict`](https://python-all.ru/3.13/library/stdtypes.html#dict), [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) и [`tuple`](https://python-all.ru/3.13/library/stdtypes.html#tuple) или подклассах, у которых не переопределён `__repr__`. Если представление объекта содержит рекурсивный элемент, рекурсивная ссылка будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.7778```python79>>> pprint.saferepr(stuff)80"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"81```8283## Объекты PrettyPrinter8485#### `class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)`8687Создаёт экземпляр `PrettyPrinter`.8889Аргументы имеют тот же смысл, что и для [`pp()`](https://python-all.ru/3.13/library/pprint.html#pprint.pp). Обратите внимание, что они расположены в другом порядке, и *sort\_dicts* по умолчанию равен `True`.9091```python92>>> import pprint93>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']94>>> stuff.insert(0, stuff[:])95>>> pp = pprint.PrettyPrinter(indent=4)96>>> pp.pprint(stuff)97[ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],98 'spam',99 'eggs',100 'lumberjack',101 'knights',102 'ni']103>>> pp = pprint.PrettyPrinter(width=41, compact=True)104>>> pp.pprint(stuff)105[['spam', 'eggs', 'lumberjack',106 'knights', 'ni'],107 'spam', 'eggs', 'lumberjack', 'knights',108 'ni']109>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',110... ('parrot', ('fresh fruit',))))))))111>>> pp = pprint.PrettyPrinter(depth=6)112>>> pp.pprint(tup)113('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))114```115116Изменено в версии 3.4: Добавлен параметр *compact*.117118Изменено в версии 3.8: добавлен параметр *sort\_dicts*.119120Изменено в версии 3.10: добавлен параметр *underscore\_numbers*.121122Изменено в версии 3.11: больше не пытается записывать в `sys.stdout`, если он равен `None`.123124Экземпляры [`PrettyPrinter`](https://python-all.ru/3.13/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:125126#### `PrettyPrinter.pformat(object)`127128Возвращает отформатированное представление *object*. Учитываются параметры, переданные конструктору [`PrettyPrinter`](https://python-all.ru/3.13/library/pprint.html#pprint.PrettyPrinter).129130#### `PrettyPrinter.pprint(object)`131132Выводит отформатированное представление *object* в настроенный поток, после чего добавляет новую строку.133134Следующие методы предоставляют реализации для соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, поскольку не нужно создавать новые объекты [`PrettyPrinter`](https://python-all.ru/3.13/library/pprint.html#pprint.PrettyPrinter).135136#### `PrettyPrinter.isreadable(object)`137138Определяет, является ли форматированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.13/library/functions.html#eval). Обратите внимание: для рекурсивных объектов возвращается `False`. Если установлен параметр *depth* в [`PrettyPrinter`](https://python-all.ru/3.13/library/pprint.html#pprint.PrettyPrinter) и объект глубже допустимого, возвращается `False`.139140#### `PrettyPrinter.isrecursive(object)`141142Определяет, требует ли объект рекурсивного представления.143144Этот метод предоставляется как хук, позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/3.13/library/pprint.html#pprint.saferepr).145146#### `PrettyPrinter.format(object, context, maxlevels, level)`147148Возвращает три значения: форматированную версию *object* в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, содержащий [`id()`](https://python-all.ru/3.13/library/functions.html#id) объектов, которые являются частью текущего контекста представления (прямые и косвенные контейнеры для *object*, влияющие на представление) в качестве ключей; если необходимо отобразить объект, который уже представлен в *context*, третье возвращаемое значение должно быть `True`. Рекурсивные вызовы метода `format()` должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, *maxlevels*, задаёт запрошенный лимит рекурсии; он будет равен `0`, если лимит не задан. Этот аргумент должен передаваться рекурсивным вызовам без изменений. Четвёртый аргумент, *level*, указывает текущий уровень; рекурсивные вызовы должны получать значение, меньшее текущего.149150## Пример151152Чтобы продемонстрировать несколько способов использования функции [`pp()`](https://python-all.ru/3.13/library/pprint.html#pprint.pp) и её параметров, получим информацию о проекте из [PyPI](https://python-all.ru/3.13/library/pprint.html):153154```python155>>> import json156>>> import pprint157>>> from urllib.request import urlopen158>>> with urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') as resp:159... project_info = json.load(resp)['info']160```161162В своей базовой форме [`pp()`](https://python-all.ru/3.13/library/pprint.html#pprint.pp) отображает весь объект:163164```python165>>> pprint.pp(project_info)166{'author': 'The Python Packaging Authority',167 'author_email': 'pypa-dev@googlegroups.com',168 'bugtrack_url': None,169 'classifiers': ['Development Status :: 3 - Alpha',170 'Intended Audience :: Developers',171 'License :: OSI Approved :: MIT License',172 'Programming Language :: Python :: 2',173 'Programming Language :: Python :: 2.6',174 'Programming Language :: Python :: 2.7',175 'Programming Language :: Python :: 3',176 'Programming Language :: Python :: 3.2',177 'Programming Language :: Python :: 3.3',178 'Programming Language :: Python :: 3.4',179 'Topic :: Software Development :: Build Tools'],180 'description': 'A sample Python project\n'181 '=======================\n'182 '\n'183 'This is the description file for the project.\n'184 '\n'185 'The file should use UTF-8 encoding and be written using '186 'ReStructured Text. It\n'187 'will be used to generate the project webpage on PyPI, and '188 'should be written for\n'189 'that purpose.\n'190 '\n'191 'Typical contents for this file would include an overview of '192 'the project, basic\n'193 'usage examples, etc. Generally, including the project '194 'changelog in here is not\n'195 'a good idea, although a simple "What\'s New" section for the '196 'most recent version\n'197 'may be appropriate.',198 'description_content_type': None,199 'docs_url': None,200 'download_url': 'UNKNOWN',201 'downloads': {'last_day': -1, 'last_month': -1, 'last_week': -1},202 'home_page': 'https://github.com/pypa/sampleproject',203 'keywords': 'sample setuptools development',204 'license': 'MIT',205 'maintainer': None,206 'maintainer_email': None,207 'name': 'sampleproject',208 'package_url': 'https://pypi.org/project/sampleproject/',209 'platform': 'UNKNOWN',210 'project_url': 'https://pypi.org/project/sampleproject/',211 'project_urls': {'Download': 'UNKNOWN',212 'Homepage': 'https://github.com/pypa/sampleproject'},213 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',214 'requires_dist': None,215 'requires_python': None,216 'summary': 'A sample Python project',217 'version': '1.2.0'}218```219220Результат можно ограничить определённой *depth* (для более глубокого содержимого используется многоточие):221222```python223>>> pprint.pp(project_info, depth=1)224{'author': 'The Python Packaging Authority',225 'author_email': 'pypa-dev@googlegroups.com',226 'bugtrack_url': None,227 'classifiers': [...],228 'description': 'A sample Python project\n'229 '=======================\n'230 '\n'231 'This is the description file for the project.\n'232 '\n'233 'The file should use UTF-8 encoding and be written using '234 'ReStructured Text. It\n'235 'will be used to generate the project webpage on PyPI, and '236 'should be written for\n'237 'that purpose.\n'238 '\n'239 'Typical contents for this file would include an overview of '240 'the project, basic\n'241 'usage examples, etc. Generally, including the project '242 'changelog in here is not\n'243 'a good idea, although a simple "What\'s New" section for the '244 'most recent version\n'245 'may be appropriate.',246 'description_content_type': None,247 'docs_url': None,248 'download_url': 'UNKNOWN',249 'downloads': {...},250 'home_page': 'https://github.com/pypa/sampleproject',251 'keywords': 'sample setuptools development',252 'license': 'MIT',253 'maintainer': None,254 'maintainer_email': None,255 'name': 'sampleproject',256 'package_url': 'https://pypi.org/project/sampleproject/',257 'platform': 'UNKNOWN',258 'project_url': 'https://pypi.org/project/sampleproject/',259 'project_urls': {...},260 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',261 'requires_dist': None,262 'requires_python': None,263 'summary': 'A sample Python project',264 'version': '1.2.0'}265```266267Кроме того, можно указать максимальную ширину *width*. Если длинный объект невозможно разбить, указанная ширина будет превышена:268269```python270>>> pprint.pp(project_info, depth=1, width=60)271{'author': 'The Python Packaging Authority',272 'author_email': 'pypa-dev@googlegroups.com',273 'bugtrack_url': None,274 'classifiers': [...],275 'description': 'A sample Python project\n'276 '=======================\n'277 '\n'278 'This is the description file for the '279 'project.\n'280 '\n'281 'The file should use UTF-8 encoding and be '282 'written using ReStructured Text. It\n'283 'will be used to generate the project '284 'webpage on PyPI, and should be written '285 'for\n'286 'that purpose.\n'287 '\n'288 'Typical contents for this file would '289 'include an overview of the project, '290 'basic\n'291 'usage examples, etc. Generally, including '292 'the project changelog in here is not\n'293 'a good idea, although a simple "What\'s '294 'New" section for the most recent version\n'295 'may be appropriate.',296 'description_content_type': None,297 'docs_url': None,298 'download_url': 'UNKNOWN',299 'downloads': {...},300 'home_page': 'https://github.com/pypa/sampleproject',301 'keywords': 'sample setuptools development',302 'license': 'MIT',303 'maintainer': None,304 'maintainer_email': None,305 'name': 'sampleproject',306 'package_url': 'https://pypi.org/project/sampleproject/',307 'platform': 'UNKNOWN',308 'project_url': 'https://pypi.org/project/sampleproject/',309 'project_urls': {...},310 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',311 'requires_dist': None,312 'requires_python': None,313 'summary': 'A sample Python project',314 'version': '1.2.0'}315```316