# `pprint` — Data pretty printer

Вихідний код: Lib/pprint.py

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

The formatted representation keeps objects on a single line if it can, and breaks them onto multiple lines if they don’t fit within the allowed width, adjustable by the width parameter defaulting to 80 characters.

Змінено в версії 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)

  Prints the formatted representation of object, followed by a newline. This function may be used in the interactive interpreter instead of the `print()` function for inspecting values. Tip: you can reassign `print = pprint.pp` for use within a scope.

  Параметри:

    - object – The object to be printed.

    - stream (file-like object | None) – A file-like object to which the output will be written by calling its `write()` method. If `None` (the default), `sys.stdout` is used.

    - indent (int) – The amount of indentation added for each nesting level.

    - width (int) – The desired maximum number of characters per line in the output. If a structure cannot be formatted within the width constraint, a best effort will be made.

    - depth (int | None) – The number of nesting levels which may be printed. If the data structure being printed is too deep, the next contained level is replaced by `...`. If `None` (the default), there is no constraint on the depth of the objects being formatted.

    - compact (bool) – Control the way long sequences are formatted. If `False` (the default), each item of a sequence will be formatted on a separate line, otherwise as many items as will fit within the width will be formatted on each output line.

    - sort_dicts (bool) – If `True`, dictionaries will be formatted with their keys sorted, otherwise they will be displayed in insertion order (the default).

    - underscore_numbers (bool) – If `True`, integers will be formatted with the `_` character for a thousands separator, otherwise underscores are not displayed (the default).

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

  Added in version 3.8.

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

  Alias for `pp()` with sort_dicts set to `True` by default, which would automatically sort the dictionaries“ keys, you might want to use `pp()` instead where it is `False` by default.

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

  Return the formatted representation of object as a string. indent, width, depth, compact, sort_dicts and underscore_numbers are passed to the `PrettyPrinter` constructor as formatting parameters and their meanings are as described in the documentation above.

pprint.isreadable(object)

  Визначте, чи є форматоване представлення об’єкта «читабельним» або його можна використати для реконструкції значення за допомогою `eval()`. Це завжди повертає `False` для рекурсивних об’єктів.

      >>> pprint.isreadable(stuff)
      False

pprint.isrecursive(object)

  Determine if object requires a recursive representation. This function is subject to the same limitations as noted in `saferepr()` below and may raise an `RecursionError` if it fails to detect a recursive object.

pprint.saferepr(object)

  Return a string representation of object, protected against recursion in some common data structures, namely instances of `dict`, `list` and `tuple` or subclasses whose `__repr__` has not been overridden. If the representation of object exposes a recursive entry, the recursive reference will be represented as `<Recursion on typename with id=number>`. The representation is not otherwise formatted.

      >>> 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)

  Construct a `PrettyPrinter` instance.

  Arguments have the same meaning as for `pp()`. Note that they are in a different order, and that sort_dicts defaults to `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: No longer attempts to write to `sys.stdout` if it is `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, дає поточний рівень; рекурсивним викликам має передаватися значення, менше значення поточного виклику.

## приклад

To demonstrate several uses of the `pp()` function and its parameters, let’s fetch information about a project from 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']

In its basic form, `pp()` shows the whole object:

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