pprint — Принтер данных

Kod źródłowy: Lib/pprint.py


Модуль pprint надає можливість „виводити” довільні структури даних Python у формі, яку можна використовувати як вхідні дані для інтерпретатора. Якщо відформатовані структури містять об’єкти, які не є фундаментальними типами Python, представлення може не завантажуватися. Це може статися, якщо включено такі об’єкти, як файли, сокети чи класи, а також багато інших об’єктів, які не можна представити як літерали Python.

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

Перед обчисленням відображення словники сортуються за ключем.

Zmienione w wersji 3.9: Додано підтримку красивого друку types.SimpleNamespace.

Zmienione w wersji 3.10: Додано підтримку красивого друку dataclasses.dataclass.

Zadania

pprint.pp(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)

Печатает форматированное представление object, за которым следует новая строка. Эту функцию можно использовать в интерактивном интерпретаторе вместо функции print() для проверки значений. Совет: вы можете переназначить print = pprint.pp для использования в пределах области видимости.

Parametry:
  • object – Объект для печати.

  • stream (file-like object | None) – Файлоподобный объект, в который будут записываться выходные данные путем вызова его метода write(). Если None (по умолчанию), используется sys.stdout.

  • indent (int) – Количество отступов, добавляемых для каждого уровня вложенности.

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

  • depth (int | None) – Количество уровней вложенности, которые можно распечатать. Если печатаемая структура данных слишком глубока, следующий содержащийся уровень заменяется на .... Если «Нет» (по умолчанию), нет ограничений на глубину форматируемых объектов.

  • compact (bool) – Управляйте способом форматирования длинных последовательностей. Если значение «False» (по умолчанию), каждый элемент последовательности будет отформатирован в отдельной строке, в противном случае в каждой выходной строке будет отформатировано столько элементов, сколько поместится в пределах ширины.

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

Dodane w wersji 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, length, compact, sort_dicts и underscore_numbers передаются конструктору PrettyPrinter в качестве параметров форматирования, и их значения описаны в документации выше.

pprint.isreadable(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', (...)))))))

Zmienione w wersji 3.4: Додано параметр compact.

Zmienione w wersji 3.8: Додано параметр sort_dicts.

Zmienione w wersji 3.10: Додано параметр underscore_numbers.

Zmienione w wersji 3.11: Больше не предпринимаются попытки записи в sys.stdout, если он имеет значение None.

Екземпляри PrettyPrinter мають такі методи:

PrettyPrinter.pformat(object)

Повертає форматоване представлення об’єкта. Це враховує параметри, передані конструктору PrettyPrinter.

PrettyPrinter.pprint(object)

Надрукуйте форматоване представлення об’єкта у налаштованому потоці, а потім новий рядок.

Наступні методи забезпечують реалізації для відповідних однойменних функцій. Використання цих методів для екземпляра є трохи ефективнішим, оскільки не потрібно створювати нові об’єкти PrettyPrinter.

PrettyPrinter.isreadable(object)

Визначте, чи форматоване представлення об’єкта є „читабельним” чи його можна використати для реконструкції значення за допомогою eval(). Зауважте, що це повертає False для рекурсивних об’єктів. Якщо встановлено параметр depth PrettyPrinter і об’єкт глибше ніж дозволено, повертається False.

PrettyPrinter.isrecursive(object)

Визначте, чи вимагає об’єкт рекурсивне представлення.

Цей метод надається як хук, щоб дозволити підкласам змінювати спосіб перетворення об’єктів на рядки. Стандартна реалізація використовує внутрішні елементи реалізації saferepr().

PrettyPrinter.format(object, context, maxlevels, level)

Повертає три значення: відформатовану версію об’єкта у вигляді рядка, позначку, яка вказує, чи читається результат, і позначку, яка вказує, чи було виявлено рекурсію. Перший аргумент - це об’єкт, який потрібно представити. Другий – це словник, який містить id() об’єктів, які є частиною поточного контексту презентації (прямі та непрямі контейнери для object, які впливають на презентацію) як ключі; якщо необхідно представити об’єкт, який уже представлено в контексті, третє значення, що повертається, має бути True. Рекурсивні виклики методу format() повинні додати додаткові записи для контейнерів до цього словника. Третій аргумент, maxlevels, дає необхідний ліміт рекурсії; це буде 0, якщо запитуваного обмеження немає. Цей аргумент слід передавати в рекурсивному вигляді без змін. Четвертий аргумент, level, дає поточний рівень; рекурсивним викликам має передаватися значення, менше значення поточного виклику.

Przykład

Чтобы продемонстрировать несколько вариантов использования функции 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'}

Крім того, можна запропонувати максимальну ширину символу. Якщо довгий об’єкт не можна розділити, указана ширина буде перевищена:

>>> 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'}