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