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 . Если параметр depth объекта PrettyPrinter задан, и объект глубже допустимого значения, это возвращает 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/pprint.html

Spec-Zone.ru

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