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

pprint.md

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

1> **Источник:** https://python-all.ru/3.1/library/pprint.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.12. `pprint` – Средство форматированного вывода данных89Модуль `pprint` предоставляет возможность «красивого вывода» произвольных структур данных Python в форме, которая может использоваться как входные данные для интерпретатора. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может быть непригодным для загрузки. Это может иметь место, если включены такие объекты, как файлы, сокеты, классы или экземпляры, а также многие другие встроенные объекты, которые не представимы в виде констант Python.1011Форматированное представление размещает объекты на одной строке, если возможно, и переносит их на несколько строк, если они не помещаются в заданную ширину. Создавайте объекты [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter) явно, если требуется изменить ограничение по ширине.1213Перед выводом словари сортируются по ключам.1415Модуль `pprint` определяет один класс:1617#### `class pprint.PrettyPrinter(...)`1819Создаёт экземпляр [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter). Этот конструктор понимает несколько именованных параметров. Выходной поток данных можно задать с помощью ключевого слова *stream*; единственный метод, используемый на объекте потока данных – это метод `write()` из протокола файлов. Если не указано, [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter) использует `sys.stdout`. Ещё три параметра могут управлять форматированным представлением. Ключевые слова: *indent*, *depth* и *width*. Величина отступа, добавляемого на каждый рекурсивный уровень, задаётся параметром *indent*; по умолчанию – один. Другие значения могут сделать вывод немного необычным, но помогают лучше различать вложенность. Количество уровней, которые могут быть выведены, контролируется параметром *depth*; если выводимая структура данных слишком глубока, следующий вложенный уровень заменяется на `...`. По умолчанию ограничений на глубину форматируемых объектов нет. Желаемая ширина вывода задаётся параметром *width*; по умолчанию 80 символов. Если структуру невозможно отформатировать в заданной ширине, будет предпринята наилучшая попытка.2021```python22>>> import pprint23>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']24>>> stuff.insert(0, stuff[:])25>>> pp = pprint.PrettyPrinter(indent=4)26>>> pp.pprint(stuff)27[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],28    'spam',29    'eggs',30    'lumberjack',31    'knights',32    'ni']33>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',34... ('parrot', ('fresh fruit',))))))))35>>> pp = pprint.PrettyPrinter(depth=6)36>>> pp.pprint(tup)37('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))38```3940Класс [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter) поддерживает несколько производных функций:4142#### `pprint.pformat(object[, indent[, width[, depth]]])`4344Возвращает форматированное представление4546*object*4748в виде строки. Параметры4950*indent*5152,5354*width*5556и5758*depth*5960будут переданы конструктору6162[`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter)6364в качестве параметров форматирования.6566#### `pprint.pprint(object[, stream[, indent[, width[, depth]]]])`6768Выводит форматированное представление *object* в *поток данных*, добавляя новую строку. Если *поток данных* опущен, используется `sys.stdout`. Это может использоваться в интерактивном интерпретаторе вместо функции [`print()`](https://python-all.ru/3.1/library/functions.html#print) для просмотра значений (можно даже переназначить `print = pprint.pprint` для использования в области видимости). *indent*, *width* и *depth* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter) в качестве параметров форматирования.6970```python71>>> import pprint72>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']73>>> stuff.insert(0, stuff)74>>> pprint.pprint(stuff)75[<Recursion on list with id=...>,76 'spam',77 'eggs',78 'lumberjack',79 'knights',80 'ni']81```8283#### `pprint.isreadable(object)`8485Определяет, является ли отформатированное представление *object* «читаемым» (readable) или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.1/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.8687```python88>>> pprint.isreadable(stuff)89False90```9192#### `pprint.isrecursive(object)`9394Определяет, требует ли объект9596*object*9798рекурсивного представления.99100Также определена ещё одна вспомогательная функция:101102#### `pprint.saferepr(object)`103104Возвращает строковое представление *object*, защищённое от рекурсивных структур данных. Если представление *object* содержит рекурсивную ссылку, она будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.105106```python107>>> pprint.saferepr(stuff)108"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"109```110111## 8.12.1. Объекты PrettyPrinter112113Экземпляры [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:114115#### `PrettyPrinter.pformat(object)`116117Возвращает отформатированное представление118119*object*120121. Учитываются параметры, переданные конструктору122123[`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter)124125.126127#### `PrettyPrinter.pprint(object)`128129Выводит отформатированное представление130131*object*132133в настроенный поток, после чего добавляет новую строку.134135Следующие методы предоставляют реализации соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, так как не требуется создавать новые объекты [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter).136137#### `PrettyPrinter.isreadable(object)`138139Определяет, является ли отформатированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.1/library/functions.html#eval). Обратите внимание: для рекурсивных объектов возвращается `False`. Если задан параметр *depth* объекта [`PrettyPrinter`](https://python-all.ru/3.1/library/pprint.html#pprint.PrettyPrinter) и объект глубже допустимого, возвращается `False`.140141#### `PrettyPrinter.isrecursive(object)`142143Определяет, требует ли объект рекурсивного представления.144145Этот метод предоставляется как перехватчик (hook), позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/3.1/library/pprint.html#pprint.saferepr).146147#### `PrettyPrinter.format(object, context, maxlevels, level)`148149Возвращает три значения: отформатированную версию150151*object*152153в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, который содержит154155[`id()`](https://python-all.ru/3.1/library/functions.html#id)156157объектов, являющихся частью текущего контекста представления (прямые и косвенные контейнеры для158159*object*160161, влияющие на представление), в качестве ключей; если нужно представить объект, который уже присутствует в162163*context*164165, третье возвращаемое значение должно быть166167`True`168169. Рекурсивные вызовы метода170171[`format()`](https://python-all.ru/3.1/library/functions.html#format)172173должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент,174175*maxlevels*176177, задаёт запрошенное ограничение на рекурсию; если ограничения нет, он равен178179`0`180181. Этот аргумент следует передавать в рекурсивные вызовы без изменений. Четвёртый аргумент,182183*level*184185, задаёт текущий уровень; рекурсивным вызовам следует передавать значение меньше текущего.186187## 8.12.2. Пример188189Чтобы продемонстрировать несколько вариантов использования функции [`pprint()`](https://python-all.ru/3.1/library/pprint.html#pprint.pprint) и её параметров, давайте получим информацию о проекте из PyPI:190191```python192>>> import json193>>> import pprint194>>> from urllib.request import urlopen195>>> with urlopen('http://pypi.python.org/pypi/configparser/json') as url:196...     http_info = url.info()197...     raw_data = url.read().decode(http_info.get_content_charset())198>>> project_info = json.loads(raw_data)199>>> result = {'headers': http_info.items(), 'body': project_info}200```201202В базовом виде [`pprint()`](https://python-all.ru/3.1/library/pprint.html#pprint.pprint) отображает весь объект:203204```python205>>> pprint.pprint(result)206{'body': {'info': {'_pypi_hidden': False,207                   '_pypi_ordering': 12,208                   'classifiers': ['Development Status :: 4 - Beta',209                                   'Intended Audience :: Developers',210                                   'License :: OSI Approved :: MIT License',211                                   'Natural Language :: English',212                                   'Operating System :: OS Independent',213                                   'Programming Language :: Python',214                                   'Programming Language :: Python :: 2',215                                   'Programming Language :: Python :: 2.6',216                                   'Programming Language :: Python :: 2.7',217                                   'Topic :: Software Development :: Libraries',218                                   'Topic :: Software Development :: Libraries :: Python Modules'],219                   'download_url': 'UNKNOWN',220                   'home_page': 'http://docs.python.org/py3k/library/configparser.html',221                   'keywords': 'configparser ini parsing conf cfg configuration file',222                   'license': 'MIT',223                   'name': 'configparser',224                   'package_url': 'http://pypi.python.org/pypi/configparser',225                   'platform': 'any',226                   'release_url': 'http://pypi.python.org/pypi/configparser/3.2.0r3',227                   'requires_python': None,228                   'stable_version': None,229                   'summary': 'This library brings the updated configparser from Python 3.2+ to Python 2.6-2.7.',230                   'version': '3.2.0r3'},231        'urls': [{'comment_text': '',232                  'downloads': 47,233                  'filename': 'configparser-3.2.0r3.tar.gz',234                  'has_sig': False,235                  'md5_digest': '8500fd87c61ac0de328fc996fce69b96',236                  'packagetype': 'sdist',237                  'python_version': 'source',238                  'size': 32281,239                  'upload_time': '2011-05-10T16:28:50',240                  'url': 'http://pypi.python.org/packages/source/c/configparser/configparser-3.2.0r3.tar.gz'}]},241'headers': [('Date', 'Sat, 14 May 2011 12:48:52 GMT'),242            ('Server', 'Apache/2.2.16 (Debian)'),243            ('Content-Disposition', 'inline'),244            ('Connection', 'close'),245            ('Transfer-Encoding', 'chunked'),246            ('Content-Type', 'application/json; charset="UTF-8"')]}247```248249Результат можно ограничить определённой *depth* (для более глубокого содержимого используется многоточие):250251```python252>>> pprint.pprint(result, depth=3)253{'body': {'info': {'_pypi_hidden': False,254                   '_pypi_ordering': 12,255                   'classifiers': [...],256                   'download_url': 'UNKNOWN',257                   'home_page': 'http://docs.python.org/py3k/library/configparser.html',258                   'keywords': 'configparser ini parsing conf cfg configuration file',259                   'license': 'MIT',260                   'name': 'configparser',261                   'package_url': 'http://pypi.python.org/pypi/configparser',262                   'platform': 'any',263                   'release_url': 'http://pypi.python.org/pypi/configparser/3.2.0r3',264                   'requires_python': None,265                   'stable_version': None,266                   'summary': 'This library brings the updated configparser from Python 3.2+ to Python 2.6-2.7.',267                   'version': '3.2.0r3'},268        'urls': [{...}]},269'headers': [('Date', 'Sat, 14 May 2011 12:48:52 GMT'),270            ('Server', 'Apache/2.2.16 (Debian)'),271            ('Content-Disposition', 'inline'),272            ('Connection', 'close'),273            ('Transfer-Encoding', 'chunked'),274            ('Content-Type', 'application/json; charset="UTF-8"')]}275```276277Кроме того, можно задать максимальную *width*. Если длинный объект не может быть разбит, указанная ширина будет превышена:278279```python280>>> pprint.pprint(result['headers'], width=30)281[('Date',282  'Sat, 14 May 2011 12:48:52 GMT'),283 ('Server',284  'Apache/2.2.16 (Debian)'),285 ('Content-Disposition',286  'inline'),287 ('Connection', 'close'),288 ('Transfer-Encoding',289  'chunked'),290 ('Content-Type',291  'application/json; charset="UTF-8"')]292```293