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

pprint – форматированный вывод данныхpprint – Data pretty printer

Исходный код: 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. Этот конструктор принимает несколько именованных параметров. Выходной поток можно задать с помощью ключевого слова поток данных; единственный метод, используемый для объекта потока – это метод 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 в поток поток данных с последующим символом новой строки. Если поток данных равен 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']"

Объекты PrettyPrinterPrettyPrinter Objects

Экземпляры 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, указывает текущий уровень; рекурсивные вызовы должны получать значение, меньшее текущего.

ПримерExample

Чтобы продемонстрировать несколько способов использования функции 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'}