pprint — Приятная печать данных

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


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

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

Словари сортируются по ключу перед вычислением отображения.

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

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

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

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

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

>>> 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, sort_dicts=True)

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

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

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

pprint.pp(object, *args, sort_dicts=False, **kwargs)

Печать форматированного представления object, за которым следует новая строка. Если sort_dicts имеет значение false (значение по умолчанию), словари будут отображаться вместе с ключами в порядке вставки, в противном случае будут отсортированы клавиши словарь. args и kwargs будут переданы pprint() в качестве параметров форматирования.

Добавлено в версии 3.8.

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

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

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

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

>>> 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 «читаемым» или может быть используемый для восстановления значение с помощью 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']"

Объекты Printer

PrettyPrinter сущности имеют следующие методы:

PrettyPrinter.pformat(object)

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

PrettyPrinter.pprint(object)

Печать форматированного представления object в настроенном потоке с последующей новой строкой.

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

PrettyPrinter.isreadable(object)

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

PrettyPrinter.isrecursive(object)

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

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

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

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

Пример

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

>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('https://pypi.org/pypi/sampleproject/json') as resp:
...     project_info = json.load(resp)['info']

В своей основной форме pprint() показывает весь объект:

>>> pprint.pprint(project_info)
{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': ['Development Status :: 3 - Alpha',
                 'Intended Audience :: Developers',
                 'License :: OSI Approved :: MIT License',
                 'Programming Language :: Python :: 2',
                 'Programming Language :: Python :: 2.6',
                 'Programming Language :: Python :: 2.7',
                 'Programming Language :: Python :: 3',
                 'Programming Language :: Python :: 3.2',
                 'Programming Language :: Python :: 3.3',
                 'Programming Language :: Python :: 3.4',
                 'Topic :: Software Development :: Build Tools'],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the project.\n'
                '\n'
                'The file should use UTF-8 encoding and be written using '
                'ReStructured Text. It\n'
                'will be used to generate the project webpage on PyPI, and '
                'should be written for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would include an overview of '
                'the project, basic\n'
                'usage examples, etc. Generally, including the project '
                'changelog in here is not\n'
                'a good idea, although a simple "What\'s New" section for the '
                'most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': {'last_day': -1, 'last_month': -1, 'last_week': -1},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': {'Download': 'UNKNOWN',
                  'Homepage': 'https://github.com/pypa/sampleproject'},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'}

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

>>> pprint.pprint(project_info, depth=1)
{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': [...],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the project.\n'
                '\n'
                'The file should use UTF-8 encoding and be written using '
                'ReStructured Text. It\n'
                'will be used to generate the project webpage on PyPI, and '
                'should be written for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would include an overview of '
                'the project, basic\n'
                'usage examples, etc. Generally, including the project '
                'changelog in here is not\n'
                'a good idea, although a simple "What\'s New" section for the '
                'most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': {...},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': {...},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'}

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

>>> pprint.pprint(project_info, depth=1, width=60)
{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': [...],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the '
                'project.\n'
                '\n'
                'The file should use UTF-8 encoding and be '
                'written using ReStructured Text. It\n'
                'will be used to generate the project '
                'webpage on PyPI, and should be written '
                'for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would '
                'include an overview of the project, '
                'basic\n'
                'usage examples, etc. Generally, including '
                'the project changelog in here is not\n'
                'a good idea, although a simple "What\'s '
                'New" section for the most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': {...},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': {...},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'}