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

pprint.md

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

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