Spec-Zone.ru › Python 3.14

pprint — модуль для красивой печати данных

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

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

При форматировании представление объектов сохраняется в одной строке, если это возможно, и разбивается на несколько строк, если оно не помещается в заданную ширину. Ширина настраивается параметром width, значение которого по умолчанию равно 80 символам.

Изменено в версии 3.9: Добавлена поддержка красивой печати types.SimpleNamespace.

Изменено в версии 3.10: Добавлена поддержка красивой печати dataclasses.dataclass.

Функции

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

Выводит отформатированное представление object, за которым следует символ новой строки. Эту функцию можно использовать в интерактивном интерпретаторе вместо функции print() для просмотра значений. Совет: можно переназначить print = pprint.pp для использования в пределах области видимости.

Параметры:
  • object – Объект для вывода.
  • stream (файлоподобный объект | None) – Файлоподобный объект, в который будет записан вывод посредством вызова его метода write(). Если None (значение по умолчанию), используется sys.stdout.
  • indent (int) – Величина отступа для каждого уровня вложенности.
  • width (int) – Желаемое максимальное количество символов в строке вывода. Если структуру невозможно отформатировать с соблюдением ограничения ширины, будет приложено максимум усилий.
  • depth (int | None) – Количество уровней вложенности, которые можно вывести. Если выводимая структура данных слишком глубока, следующий уровень вложенности заменяется на .... Если None (значение по умолчанию), глубина форматируемых объектов не ограничивается.
  • compact (bool) – Управляет форматированием длинных последовательностей. Если False (значение по умолчанию), каждый элемент последовательности форматируется в отдельной строке; в противном случае в каждой строке вывода форматируется столько элементов, сколько помещается в пределах width.
  • sort_dicts (bool) – Если True, словари форматируются с сортировкой ключей; в противном случае они отображаются в порядке вставки (значение по умолчанию).
  • underscore_numbers (bool) – Если True, целые числа форматируются с символом _ в качестве разделителя тысяч; в противном случае подчёркивания не отображаются (значение по умолчанию).
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff)
>>> pprint.pp(stuff)
[<Recursion on list with id=...>,
 'spam',
 'eggs',
 'lumberjack',
 'knights',
 'ni']

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

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

Псевдоним для pp(), у которого параметр sort_dicts по умолчанию имеет значение True, то есть ключи словарей автоматически сортируются. Если это нежелательно, можно использовать pp(), у которого по умолчанию установлено значение False.

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

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

pprint.isreadable(object)

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

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

Определяет, требует ли object рекурсивного представления. На эту функцию распространяются те же ограничения, что и на saferepr() ниже; если ей не удастся обнаружить рекурсивный объект, она может вызвать исключение RecursionError.

pprint.saferepr(object)

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

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

Объекты PrettyPrinter

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

Создаёт экземпляр PrettyPrinter.

Аргументы имеют то же значение, что и для pp(). Обратите внимание, что они расположены в другом порядке, а значение sort_dicts по умолчанию равно True.

>>> 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', (...)))))))

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

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

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

Изменено в версии 3.11: Больше не предпринимается попыток записи в sys.stdout, если это None.

У экземпляров PrettyPrinter есть следующие методы:

PrettyPrinter.pformat(object)

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

PrettyPrinter.pprint(object)

Выводит отформатированное представление object в настроенный поток, за которым следует символ новой строки.

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

PrettyPrinter.isreadable(object)

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

PrettyPrinter.isrecursive(object)

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

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

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

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

Пример

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

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

В простейшем виде pp() показывает весь объект:

>>> pprint.pp(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'}

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

>>> pprint.pp(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'}

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

>>> pprint.pp(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'}

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/pprint.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API