pprint
— Данные для принтера pretty¶
Исходный код: Lib/pprint.py
Модуль pprint
предоставляет возможность «красиво печатать» произвольные структуры данных Python в форме, которая может использоваться в качестве входных данных для интерпретатора. Если форматированные структуры включают объекты, которые не являются основными типами Python, представление может быть недоступно для загрузки. Это может иметь место, если включены такие объекты, как файлы, сокеты или классы, а также многие другие объекты, которые не могут быть представлены в виде литералов Python.
Форматированное представление сохраняет объекты в одной строке, если это возможно, и разбивает их на несколько строк, если они не укладываются в допустимую ширину. Если вам нужно настроить ограничение ширины, явно создайте объекты PrettyPrinter
.
Перед вычислением отображения словари сортируются по ключу.
Изменено в версии 3.9: Добавлена поддержка красивой печати types.SimpleNamespace
.
Изменено в версии 3.10: Добавлена поддержка красивой печати dataclasses.dataclass
.
Функции¶
- pprint.pp(object, *args, sort_dicts=False, **kwargs)¶
Выводит форматированное представление object, за которым следует новая строка. Если значение sort_dicts равно false (значение по умолчанию), словари будут отображаться с их ключами в порядке вставки, в противном случае ключи dict будут отсортированы. args и kwargs будут переданы в
pprint()
в качестве параметров форматирования.>>> 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']
Добавлено в версии 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
, и их значения приведены в документации к нему ниже.Обратите внимание, что значение 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, depth, compact, sort_dicts и underscore_numbers передаются в конструктор
PrettyPrinter
в качестве параметров форматирования, и их значения описаны в документации к нему ниже.
- 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']"
Красивые объекты для печати¶
Этот модуль определяет один класс:
- class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Создайте экземпляр
PrettyPrinter
. Этот конструктор поддерживает несколько параметров ключевых слов.stream (по умолчанию
sys.stdout
) - это file-like object, в который будет записан вывод при вызове его методаwrite()
. Если и stream, иsys.stdout
равныNone
, тоpprint()
автоматически возвращается.Другие значения определяют способ отображения вложенности сложных структур данных.
отступ (по умолчанию 1) указывает величину отступа, добавляемого для каждого уровня вложенности.
глубина определяет количество уровней вложенности, которые могут быть напечатаны; если печатаемая структура данных слишком глубокая, следующий уровень вложенности заменяется на
...
. По умолчанию нет ограничений на глубину форматируемых объектов.ширина (по умолчанию 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', (...)))))))
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()
объектов, которые являются частью текущего контекста представления (прямые и косвенные контейнеры для объекта, которые влияют на представление) в качестве ключей; если необходимо представить объект, который уже представлен в контексте, третье возвращаемое значение должно бытьTrue
. Рекурсивные вызовы методаformat()
должны добавить дополнительные записи для контейнеров в этот словарь. Третий аргумент, maxlevels, задает запрошенный предел для рекурсии; это будет0
, если запрошенный предел отсутствует. Этот аргумент должен передаваться рекурсивным вызовам без изменений. Четвертый аргумент, level, указывает текущий уровень; рекурсивным вызовам должно передаваться значение, меньшее, чем у текущего вызова.
Пример¶
Чтобы продемонстрировать несколько вариантов использования функции pp()
и ее параметров, давайте возьмем информацию о проекте из 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']
В своей базовой форме 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'}