Документация Python неофициальный перевод

pprint.md

225 строк · 17.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/pprint.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7.12. [`pprint`](https://python-all.ru/3.2/library/pprint.html#module-pprint) – Форматированный вывод данных89**Исходный код:** [Lib/pprint.py](https://python-all.ru/src/3.2/Lib/pprint.py)1011---1213Модуль [`pprint`](https://python-all.ru/3.2/library/pprint.html#module-pprint) предоставляет возможность «красивого» вывода произвольных структур данных Python в форме, которая может использоваться как входные данные для интерпретатора. Если форматированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может быть непригодным для загрузки. Так может быть в случае включения таких объектов, как файлы, сокеты, классы или экземпляры, а также многих других встроенных объектов, которые не представимы в виде констант Python.1415Форматированное представление размещает объекты на одной строке, если возможно, и переносит их на несколько строк, если они не помещаются в заданную ширину. Создавайте объекты [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) явно, если требуется изменить ограничение по ширине.1617Перед выводом словари сортируются по ключам.1819Модуль [`pprint`](https://python-all.ru/3.2/library/pprint.html#module-pprint) определяет один класс:2021#### `class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None)`2223Создаёт экземпляр [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter). Этот конструктор понимает несколько именованных параметров. Выходной поток данных можно задать с помощью ключевого слова *stream*; единственный метод, используемый на объекте потока данных – это метод `write()` из протокола файлов. Если не указано, [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) использует `sys.stdout`. Ещё три параметра могут управлять форматированным представлением. Ключевые слова: *indent*, *depth* и *width*. Величина отступа, добавляемого на каждый рекурсивный уровень, задаётся параметром *indent*; по умолчанию – один. Другие значения могут сделать вывод немного необычным, но помогают лучше различать вложенность. Количество уровней, которые могут быть выведены, контролируется параметром *depth*; если выводимая структура данных слишком глубока, следующий вложенный уровень заменяется на `...`. По умолчанию ограничений на глубину форматируемых объектов нет. Желаемая ширина вывода задаётся параметром *width*; по умолчанию 80 символов. Если структуру невозможно отформатировать в заданной ширине, будет предпринята наилучшая попытка.2425```python26>>> import pprint27>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']28>>> stuff.insert(0, stuff[:])29>>> pp = pprint.PrettyPrinter(indent=4)30>>> pp.pprint(stuff)31[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],32    'spam',33    'eggs',34    'lumberjack',35    'knights',36    'ni']37>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',38... ('parrot', ('fresh fruit',))))))))39>>> pp = pprint.PrettyPrinter(depth=6)40>>> pp.pprint(tup)41('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))42```4344Класс [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) поддерживает несколько производных функций:4546#### `pprint.pformat(object, indent=1, width=80, depth=None)`4748Возвращает форматированное представление *object* в виде строки. Параметры *indent*, *width* и *depth* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.4950#### `pprint.pprint(object, stream=None, indent=1, width=80, depth=None)`5152Выводит форматированное представление *object* в поток *stream*, за которым следует перевод строки. Если *stream* равен `None`, используется `sys.stdout`. Это может использоваться в интерактивном интерпретаторе вместо функции [`print()`](https://python-all.ru/3.2/library/functions.html#print) для просмотра значений (можно даже переназначить `print = pprint.pprint` для использования в области видимости). Параметры *indent*, *width* и *depth* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.5354```python55>>> import pprint56>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']57>>> stuff.insert(0, stuff)58>>> pprint.pprint(stuff)59[<Recursion on list with id=...>,60 'spam',61 'eggs',62 'lumberjack',63 'knights',64 'ni']65```6667#### `pprint.isreadable(object)`6869Определяет, является ли отформатированное представление *object* «читаемым» (readable) или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.2/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.7071```python72>>> pprint.isreadable(stuff)73False74```7576#### `pprint.isrecursive(object)`7778Определяет, требует ли объект *object* рекурсивного представления.7980Также определена ещё одна вспомогательная функция:8182#### `pprint.saferepr(object)`8384Возвращает строковое представление *object*, защищённое от рекурсивных структур данных. Если представление *object* содержит рекурсивную ссылку, она будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.8586```python87>>> pprint.saferepr(stuff)88"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"89```9091## 7.12.1. Объекты PrettyPrinter9293Экземпляры [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:9495#### `PrettyPrinter.pformat(object)`9697Возвращает отформатированное представление *object*. Учитываются параметры, переданные конструктору [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter).9899#### `PrettyPrinter.pprint(object)`100101Выводит отформатированное представление *object* в настроенный поток, после чего добавляет новую строку.102103Следующие методы предоставляют реализации соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, так как не требуется создавать новые объекты [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter).104105#### `PrettyPrinter.isreadable(object)`106107Определяет, является ли отформатированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.2/library/functions.html#eval). Обратите внимание: для рекурсивных объектов возвращается `False`. Если задан параметр *depth* объекта [`PrettyPrinter`](https://python-all.ru/3.2/library/pprint.html#pprint.PrettyPrinter) и объект глубже допустимого, возвращается `False`.108109#### `PrettyPrinter.isrecursive(object)`110111Определяет, требует ли объект рекурсивного представления.112113Этот метод предоставляется как перехватчик (hook), позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/3.2/library/pprint.html#pprint.saferepr).114115#### `PrettyPrinter.format(object, context, maxlevels, level)`116117Возвращает три значения: отформатированную версию *object* в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, который содержит [`id()`](https://python-all.ru/3.2/library/functions.html#id) объектов, являющихся частью текущего контекста представления (прямые и косвенные контейнеры для *object*, влияющие на представление), в качестве ключей; если нужно представить объект, который уже присутствует в *context*, третье возвращаемое значение должно быть `True`. Рекурсивные вызовы метода [`format()`](https://python-all.ru/3.2/library/functions.html#format) должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, *maxlevels*, задаёт запрошенное ограничение на рекурсию; если ограничения нет, он равен `0`. Этот аргумент следует передавать в рекурсивные вызовы без изменений. Четвёртый аргумент, *level*, задаёт текущий уровень; рекурсивным вызовам следует передавать значение меньше текущего.118119## 7.12.2. Пример120121Чтобы продемонстрировать несколько вариантов использования функции [`pprint()`](https://python-all.ru/3.2/library/pprint.html#module-pprint) и её параметров, давайте получим информацию о проекте из PyPI:122123```python124>>> import json125>>> import pprint126>>> from urllib.request import urlopen127>>> with urlopen('http://pypi.python.org/pypi/configparser/json') as url:128...     http_info = url.info()129...     raw_data = url.read().decode(http_info.get_content_charset())130>>> project_info = json.loads(raw_data)131>>> result = {'headers': http_info.items(), 'body': project_info}132```133134В базовом виде [`pprint()`](https://python-all.ru/3.2/library/pprint.html#module-pprint) отображает весь объект:135136```python137>>> pprint.pprint(result)138{'body': {'info': {'_pypi_hidden': False,139                   '_pypi_ordering': 12,140                   'classifiers': ['Development Status :: 4 - Beta',141                                   'Intended Audience :: Developers',142                                   'License :: OSI Approved :: MIT License',143                                   'Natural Language :: English',144                                   'Operating System :: OS Independent',145                                   'Programming Language :: Python',146                                   'Programming Language :: Python :: 2',147                                   'Programming Language :: Python :: 2.6',148                                   'Programming Language :: Python :: 2.7',149                                   'Topic :: Software Development :: Libraries',150                                   'Topic :: Software Development :: Libraries :: Python Modules'],151                   'download_url': 'UNKNOWN',152                   'home_page': 'http://docs.python.org/py3k/library/configparser.html',153                   'keywords': 'configparser ini parsing conf cfg configuration file',154                   'license': 'MIT',155                   'name': 'configparser',156                   'package_url': 'http://pypi.python.org/pypi/configparser',157                   'platform': 'any',158                   'release_url': 'http://pypi.python.org/pypi/configparser/3.2.0r3',159                   'requires_python': None,160                   'stable_version': None,161                   'summary': 'This library brings the updated configparser from Python 3.2+ to Python 2.6-2.7.',162                   'version': '3.2.0r3'},163        'urls': [{'comment_text': '',164                  'downloads': 47,165                  'filename': 'configparser-3.2.0r3.tar.gz',166                  'has_sig': False,167                  'md5_digest': '8500fd87c61ac0de328fc996fce69b96',168                  'packagetype': 'sdist',169                  'python_version': 'source',170                  'size': 32281,171                  'upload_time': '2011-05-10T16:28:50',172                  'url': 'http://pypi.python.org/packages/source/c/configparser/configparser-3.2.0r3.tar.gz'}]},173'headers': [('Date', 'Sat, 14 May 2011 12:48:52 GMT'),174            ('Server', 'Apache/2.2.16 (Debian)'),175            ('Content-Disposition', 'inline'),176            ('Connection', 'close'),177            ('Transfer-Encoding', 'chunked'),178            ('Content-Type', 'application/json; charset="UTF-8"')]}179```180181Результат можно ограничить определённой *depth* (для более глубокого содержимого используется многоточие):182183```python184>>> pprint.pprint(result, depth=3)185{'body': {'info': {'_pypi_hidden': False,186                   '_pypi_ordering': 12,187                   'classifiers': [...],188                   'download_url': 'UNKNOWN',189                   'home_page': 'http://docs.python.org/py3k/library/configparser.html',190                   'keywords': 'configparser ini parsing conf cfg configuration file',191                   'license': 'MIT',192                   'name': 'configparser',193                   'package_url': 'http://pypi.python.org/pypi/configparser',194                   'platform': 'any',195                   'release_url': 'http://pypi.python.org/pypi/configparser/3.2.0r3',196                   'requires_python': None,197                   'stable_version': None,198                   'summary': 'This library brings the updated configparser from Python 3.2+ to Python 2.6-2.7.',199                   'version': '3.2.0r3'},200        'urls': [{...}]},201'headers': [('Date', 'Sat, 14 May 2011 12:48:52 GMT'),202            ('Server', 'Apache/2.2.16 (Debian)'),203            ('Content-Disposition', 'inline'),204            ('Connection', 'close'),205            ('Transfer-Encoding', 'chunked'),206            ('Content-Type', 'application/json; charset="UTF-8"')]}207```208209Кроме того, можно задать максимальную *width*. Если длинный объект не может быть разбит, указанная ширина будет превышена:210211```python212>>> pprint.pprint(result['headers'], width=30)213[('Date',214  'Sat, 14 May 2011 12:48:52 GMT'),215 ('Server',216  'Apache/2.2.16 (Debian)'),217 ('Content-Disposition',218  'inline'),219 ('Connection', 'close'),220 ('Transfer-Encoding',221  'chunked'),222 ('Content-Type',223  'application/json; charset="UTF-8"')]224```225