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) -
Выводит отформатированное представление объекта, после которого следует новая строка. Эта функция может быть использована в интерактивном интерпретаторе вместо функции
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/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.12/library/pprint.html