Spec-Zone.ru › Python 3.11

pprint — Форматированный вывод данных

Исходный код: Lib/pprint.py

Модуль pprint предоставляет возможность форматированного вывода произвольных Python-структур данных в виде, пригодном для ввода в интерпретатор. Если форматируемые структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может быть не загружаемым. Это может быть случаем, если в структуре содержатся такие объекты, как файлы, сокеты или классы, а также многие другие объекты, не представимые в виде Python-литералов.

Форматированное представление пытается разместить объекты на одной строке, если возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину. Необходимо явно создавать объекты PrettyPrinter, если требуется настроить ограничение ширины.

Словари сортируются по ключу перед вычислением отображения.

Изменено в версии 3.9: Добавлена поддержка форматированного вывода types.SimpleNamespace.

Изменено в версии 3.10: Добавлена поддержка форматированного вывода dataclasses.dataclass.

Модуль pprint определяет один класс:

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Создаёт экземпляр PrettyPrinter. Этот конструктор понимает несколько ключевых параметров.

stream (по умолчанию sys.stdout) — это объект, подобный файлу, в который будет записываться вывод, вызывая его метод write(). Если оба stream и sys.stdout являются None, то pprint() молча возвращает значение.

Другие значения конфигурируют способ отображения вложенности сложных структур данных.

indent (по умолчанию 1) указывает размер отступа для каждого уровня вложенности.

depth управляет количеством уровней вложенности, которые могут быть выведены; если структура данных слишком глубокая, следующий вложенный уровень заменяется на .... По умолчанию нет ограничений на глубину форматируемых объектов.

width (по умолчанию 80) определяет желаемое максимальное количество символов на строке в выводе. Если структуру нельзя отформатировать в рамках ограничения ширины, будет сделана лучшая попытка.

compact влияет на способ форматирования длинных последовательностей (списков, кортежей, множеств и т. д.). Если compact равно false (по умолчанию), каждый элемент последовательности будет отформатирован на отдельной строке. Если compact равно true, как можно больше элементов, которые помещаются в width, будут отформатированы на каждой строке вывода.

Если sort_dicts равно true (по умолчанию), словари будут отформатированы с отсортированными ключами, в противном случае они будут отображаться в порядке вставки.

Если underscore_numbers равно true, целые числа будут отформатированы с символом _ в качестве разделителя тысяч; в противном случае символы подчеркивания не отображаются (по умолчанию).

Изменено в версии 3.4: Добавлен параметр compact.

Изменено в версии 3.8: Добавлен параметр sort_dicts.

Изменено в версии 3.10: Добавлен параметр underscore_numbers.

Изменено в версии 3.11: Больше не пытается записать в sys.stdout, если он None.

>>> 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.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.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, underscore_numbers=False)

Выводит отформатированное представление object в stream, после чего переходит на новую строку. Если stream равен None, используется sys.stdout. Это может быть использовано в интерактивной оболочке вместо функции print() для просмотра значений (вы даже можете переназначить print = pprint.pprint для использования в области видимости).

Параметры конфигурации stream, indent, width, depth, compact, sort_dicts и underscore_numbers передаются конструктору PrettyPrinter, и их значения описаны в его документации выше.

>>> 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']"

Объекты 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/pprint.html

Spec-Zone.ru

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