pprint — Красивый вывод данных
Исходный код: Lib/pprint.py
Модуль pprint предоставляет возможность «красивого вывода» произвольных структур данных Python в формате, который может быть использован как вход для интерпретатора. Если форматируемые структуры включают объекты, которые не являются фундаментальными типами Python, представление может быть не загружаемым. Это может быть так, если в них включены такие объекты, как файлы, сокеты или классы, а также многие другие объекты, которые не могут быть представлены в виде литералов Python.
Форматированное представление сохраняет объекты на одной строке, если это возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину. Для изменения ограничения ширины необходимо явно создавать объекты PrettyPrinter.
Словари сортируются по ключу перед вычислением отображения.
Изменено в версии 3.9: Добавлена поддержка красивого вывода types.SimpleNamespace.
Модуль pprint определяет один класс:
-
class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True) -
Создаёт экземпляр
PrettyPrinter. Этот конструктор понимает несколько ключевых параметров. Поток вывода можно установить с помощью ключевого параметра stream; единственный метод, используемый для объекта потока, это методwrite()протокола файла. Если не указано,PrettyPrinterиспользуетsys.stdout. Количество отступов, добавляемых для каждого рекурсивного уровня, задаётся параметром indent; по умолчанию оно равно одному. Другие значения могут привести к немного странному выводу, но могут сделать вложенность легче различимой. Количество уровней, которые могут быть выведены, контролируется параметром depth; если структура данных, которая выводится, слишком глубока, следующий вложенный уровень заменяется на.... По умолчанию нет ограничений на глубину форматируемых объектов. Желаемая ширина вывода ограничена параметром width; по умолчанию она равна 80 символам. Если структуру нельзя отформатировать в пределах ограниченной ширины, будет сделана попытка наилучшего отображения. Если compact имеет значение false (по умолчанию), каждый элемент длинной последовательности будет форматироваться на отдельной строке. Если compact имеет значение true, в каждой строке вывода будет форматироваться столько элементов, сколько поместится в width. Если sort_dicts имеет значение true (по умолчанию), словари будут форматироваться с отсортированными ключами; в противном случае они будут отображаться в порядке вставки.Изменено в версии 3.4: Добавлен параметр compact.
Изменено в версии 3.8: Добавлен параметр sort_dicts.
>>> 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', (...)))))))
Модуль pprint также предоставляет несколько функций-обёрток:
-
pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True) -
Возвращает форматированное представление объекта object в виде строки. indent, width, depth, compact и sort_dicts будут переданы конструктору
PrettyPrinterв качестве параметров форматирования.Изменено в версии 3.4: Добавлен параметр compact.
Изменено в версии 3.8: Добавлен параметр sort_dicts.
-
pprint.pp(object, *args, sort_dicts=False, **kwargs) -
Выводит форматированное представление объекта object, после чего переходит на новую строку. Если sort_dicts имеет значение false (по умолчанию), словари будут отображаться с ключами в порядке вставки; в противном случае ключи словарей будут отсортированы. args и kwargs будут переданы модулю
pprint()в качестве параметров форматирования.Введено в версии 3.8.
-
pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True) -
Выводит форматированное представление объекта object в поток stream, после чего переходит на новую строку. Если stream является
None, используетсяsys.stdout. Это может быть использовано в интерактивном интерпретаторе вместо функцииprint()для проверки значений (вы даже можете переопределитьprint = pprint.pprintдля использования в пределах области видимости). indent, width, depth, compact и sort_dicts будут переданы конструкторуPrettyPrinterв качестве параметров форматирования.Изменено в версии 3.4: Добавлен параметр compact.
Изменено в версии 3.8: Добавлен параметр sort_dicts.
>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) >>> pprint.pprint(stuff) [<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']
-
pprint.isreadable(object) -
Определяет, является ли форматированное представление объекта object «читаемым» или может быть использовано для восстановления значения с помощью
eval(). Для рекурсивных объектов это всегда возвращаетFalse.>>> pprint.isreadable(stuff) False
-
pprint.isrecursive(object) -
Определяет, требует ли объект рекурсивного представления.
Также определена ещё одна вспомогательная функция:
-
pprint.saferepr(object) -
Возвращает строковое представление объекта object, защищённое от рекурсивных структур данных. Если представление объекта содержит рекурсивную ссылку, рекурсивная ссылка будет представлена как
<Recursion on typename with id=number>. В противном случае представление не форматируется.>>> pprint.saferepr(stuff) "[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
Объекты PrettyPrinter
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, задаёт текущий уровень; рекурсивные вызовы должны передавать значение меньше, чем у текущего вызова.
Пример
Для демонстрации нескольких способов использования функции pprint() и её параметров давайте получим информацию о проекте из 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']
В своём базовом виде pprint() показывает весь объект:
>>> pprint.pprint(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.pprint(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.pprint(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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/pprint.html