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

8.11. pprint – Форматирование данныхpprint – Data pretty printer

Исходный код: Lib/pprint.py


Модуль pprint предоставляет возможность красиво форматировать («pretty-print») произвольные структуры данных Python в форме, которую можно использовать как ввод в интерпретатор. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может оказаться непригодным для загрузки. Это может произойти, если в них включены такие объекты, как файлы, сокеты или классы, а также многие другие объекты, которые нельзя представить в виде литералов Python.

Форматированное представление размещает объекты на одной строке, если возможно, и переносит их на несколько строк, если они не помещаются в заданную ширину. Создавайте объекты PrettyPrinter явно, если требуется изменить ограничение по ширине.

Перед выводом словари сортируются по ключам.

Модуль pprint определяет один класс:

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False)

Создание экземпляра PrettyPrinter. Конструктор принимает несколько именованных параметров. Выходной поток данных можно задать с помощью ключевого слова stream; единственный используемый метод объекта потока данных – метод write() файлового протокола. Если поток данных не указан, PrettyPrinter использует sys.stdout. Величина отступа, добавляемого на каждом рекурсивном уровне, задаётся параметром indent; по умолчанию – один. Другие значения могут сделать вывод немного необычным, но могут облегчить визуальное восприятие вложенности. Количество уровней, которые могут быть напечатаны, ограничивается параметром depth; если печатаемая структура данных слишком глубока, следующий вложенный уровень заменяется на .... По умолчанию глубина форматируемых объектов не ограничена. Требуемая ширина вывода задаётся параметром width; по умолчанию – 80 символов. Если структуру невозможно отформатировать в заданной ширине, будет предпринята максимально возможная попытка. Если compact равен false (по умолчанию), каждый элемент длинной последовательности будет отформатирован на отдельной строке. Если compact равен true, на каждой строке вывода будет помещено максимальное количество элементов, помещающихся в заданную width.

Изменено в версии 3.4: Добавлен параметр compact.

>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff[:])
>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(stuff)
[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
    'spam',
    'eggs',
    'lumberjack',
    'knights',
    'ni']
>>> pp = pprint.PrettyPrinter(width=41, compact=True)
>>> pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
  'knights', 'ni'],
 'spam', 'eggs', 'lumberjack', 'knights',
 'ni']
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> pp = pprint.PrettyPrinter(depth=6)
>>> pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))

Модуль pprint также предоставляет несколько функций для быстрого доступа:

pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)

Возвращает отформатированное представление object в виде строки. Параметры indent, width, depth и compact передаются конструктору PrettyPrinter в качестве параметров форматирования.

Изменено в версии 3.4: Добавлен параметр compact.

pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)

Выводит отформатированное представление object в поток данных поток данных, завершая переводом строки. Если поток данных равен None, используется sys.stdout. Эту функцию можно использовать в интерактивном интерпретаторе вместо функции print() для просмотра значений (можно даже переназначить print = pprint.pprint для использования в области видимости). Параметры indent, width, depth и compact передаются конструктору PrettyPrinter в качестве параметров форматирования.

Изменено в версии 3.4: Добавлен параметр compact.

>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff)
>>> pprint.pprint(stuff)
[<Recursion on list with id=...>,
 'spam',
 'eggs',
 'lumberjack',
 'knights',
 'ni']
pprint.isreadable(object)

Определяет, является ли отформатированное представление object «читаемым» (readable) или может быть использовано для восстановления значения с помощью eval(). Для рекурсивных объектов всегда возвращает False.

>>> pprint.isreadable(stuff)
False
pprint.isrecursive(object)

Определяет, требует ли объект object рекурсивного представления.

Также определена ещё одна вспомогательная функция:

pprint.saferepr(object)

Возвращает строковое представление object, защищённое от рекурсивных структур данных. Если представление object содержит рекурсивную ссылку, она будет представлена как <Recursion on typename with id=number>. В остальном представление не форматируется.

>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"

8.11.1. Объекты PrettyPrinterPrettyPrinter Objects

Экземпляры PrettyPrinter имеют следующие методы:

PrettyPrinter.pformat(object)

Возвращает отформатированное представление object. Учитываются параметры, переданные конструктору PrettyPrinter.

PrettyPrinter.pprint(object)

Выводит отформатированное представление object в настроенный поток, после чего добавляет новую строку.

Следующие методы предоставляют реализации соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, так как не требуется создавать новые объекты PrettyPrinter.

PrettyPrinter.isreadable(object)

Определяет, является ли отформатированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью eval(). Обратите внимание: для рекурсивных объектов возвращается False. Если задан параметр depth объекта PrettyPrinter и объект глубже допустимого, возвращается False.

PrettyPrinter.isrecursive(object)

Определяет, требует ли объект рекурсивного представления.

Этот метод предоставляется как перехватчик (hook), позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации saferepr().

PrettyPrinter.format(object, context, maxlevels, level)

Возвращает три значения: отформатированную версию object в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, который содержит id() объектов, являющихся частью текущего контекста представления (прямые и косвенные контейнеры для object, влияющие на представление), в качестве ключей; если нужно представить объект, который уже присутствует в context, третье возвращаемое значение должно быть True. Рекурсивные вызовы метода format() должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, maxlevels, задаёт запрошенное ограничение на рекурсию; если ограничения нет, он равен 0. Этот аргумент следует передавать в рекурсивные вызовы без изменений. Четвёртый аргумент, level, задаёт текущий уровень; рекурсивным вызовам следует передавать значение меньше текущего.

8.11.2. ПримерExample

Чтобы продемонстрировать несколько вариантов использования функции pprint() и её параметров, получим информацию о проекте из PyPI:

>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('http://pypi.python.org/pypi/Twisted/json') as url:
...     http_info = url.info()
...     raw_data = url.read().decode(http_info.get_content_charset())
>>> project_info = json.loads(raw_data)

В базовом виде pprint() отображает весь объект:

>>> pprint.pprint(project_info)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': ['Programming Language :: Python :: 2.6',
                          'Programming Language :: Python :: 2.7',
                          'Programming Language :: Python :: 2 :: Only'],
          'description': 'An extensible framework for Python programming, '
                         'with special focus\r\n'
                         'on event-based network programming and '
                         'multiprotocol integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking framework written in Python',
          'version': '12.3.0'},
 'urls': [{'comment_text': '',
           'downloads': 71844,
           'filename': 'Twisted-12.3.0.tar.bz2',
           'has_sig': False,
           'md5_digest': '6e289825f3bf5591cfd670874cc0862d',
           'packagetype': 'sdist',
           'python_version': 'source',
           'size': 2615733,
           'upload_time': '2012-12-26T12:47:03',
           'url': 'https://pypi.python.org/packages/source/T/Twisted/Twisted-12.3.0.tar.bz2'},
          {'comment_text': '',
           'downloads': 5224,
           'filename': 'Twisted-12.3.0.win32-py2.7.msi',
           'has_sig': False,
           'md5_digest': '6b778f5201b622a5519a2aca1a2fe512',
           'packagetype': 'bdist_msi',
           'python_version': '2.7',
           'size': 2916352,
           'upload_time': '2012-12-26T12:48:15',
           'url': 'https://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.3.0.win32-py2.7.msi'}]}

Результат можно ограничить определённой depth (для более глубокого содержимого используется многоточие):

>>> pprint.pprint(project_info, depth=2)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': [...],
          'description': 'An extensible framework for Python programming, '
                         'with special focus\r\n'
                         'on event-based network programming and '
                         'multiprotocol integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous networking framework written in Python',
          'version': '12.3.0'},
 'urls': [{...}, {...}]}

Кроме того, можно указать максимальную ширину width. Если длинный объект невозможно разбить, указанная ширина будет превышена:

>>> pprint.pprint(project_info, depth=2, width=50)
{'info': {'_pypi_hidden': False,
          '_pypi_ordering': 125,
          'author': 'Glyph Lefkowitz',
          'author_email': 'glyph@twistedmatrix.com',
          'bugtrack_url': '',
          'cheesecake_code_kwalitee_id': None,
          'cheesecake_documentation_id': None,
          'cheesecake_installability_id': None,
          'classifiers': [...],
          'description': 'An extensible '
                         'framework for '
                         'Python programming, '
                         'with special '
                         'focus\r\n'
                         'on event-based '
                         'network programming '
                         'and multiprotocol '
                         'integration.',
          'docs_url': '',
          'download_url': 'UNKNOWN',
          'home_page': 'http://twistedmatrix.com/',
          'keywords': '',
          'license': 'MIT',
          'maintainer': '',
          'maintainer_email': '',
          'name': 'Twisted',
          'package_url': 'http://pypi.python.org/pypi/Twisted',
          'platform': 'UNKNOWN',
          'release_url': 'http://pypi.python.org/pypi/Twisted/12.3.0',
          'requires_python': None,
          'stable_version': None,
          'summary': 'An asynchronous '
                     'networking framework '
                     'written in Python',
          'version': '12.3.0'},
 'urls': [{...}, {...}]}