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
для рекурсивних об’єктів. Якщо встановлено параметр depthPrettyPrinter
і об’єкт глибше ніж дозволено, повертається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'}