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