Spec-Zone.ru › Python 3.13

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'}

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

>>> 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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/pprint.html

Spec-Zone.ru

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