Документация Python неофициальный перевод

pprint.md

335 строк · 22.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.10/library/pprint.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`pprint`](https://python-all.ru/3.10/library/pprint.html#module-pprint) – форматированный вывод данных89**Исходный код:** [Lib/pprint.py](https://python-all.ru/src/3.10/Lib/pprint.py)1011---1213Модуль [`pprint`](https://python-all.ru/3.10/library/pprint.html#module-pprint) предоставляет возможность «форматированного вывода» произвольных структур данных Python в форме, которую можно использовать как входные данные для интерпретатора. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может оказаться незагружаемым. Так бывает, если включены объекты вроде файлов, сокетов или классов, а также многие другие объекты, которые не представимы в виде литералов Python.1415Форматированное представление помещает объекты на одну строку, если возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину. Для изменения ограничения по ширине создавайте объекты [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter) явно.1617Перед выводом словари сортируются по ключам.1819Изменено в версии 3.9: Добавлена поддержка форматированного вывода [`types.SimpleNamespace`](https://python-all.ru/3.10/library/types.html#types.SimpleNamespace).2021Изменено в версии 3.10: Добавлена поддержка форматированного вывода [`dataclasses.dataclass`](https://python-all.ru/3.10/library/dataclasses.html#dataclasses.dataclass).2223Модуль [`pprint`](https://python-all.ru/3.10/library/pprint.html#module-pprint) определяет один класс:2425#### `class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)`2627Создаёт экземпляр [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter). Этот конструктор принимает несколько именованных параметров.2829*поток данных* (по умолчанию `sys.stdout`) – это [файлоподобный объект](https://python-all.ru/3.10/glossary.html#term-file-like-object), в который будет записан вывод вызовом его метода `write()`.3031Остальные параметры определяют способ отображения вложенности сложных структур данных.3233*indent* (по умолчанию 1) задаёт величину отступа, добавляемого для каждого уровня вложенности.3435*depth* управляет количеством уровней вложенности, которые могут быть выведены; если выводимая структура данных слишком глубока, следующий уровень заменяется на `...`. По умолчанию ограничения на глубину форматируемых объектов нет.3637*width* (по умолчанию 80) задаёт желаемое максимальное количество символов на строку в выводе. Если структура не может быть отформатирована с учётом ограничения по ширине, будет предпринята попытка наилучшего возможного форматирования.3839*compact* влияет на способ форматирования длинных последовательностей (списков, кортежей, множеств и т.д.). Если *compact* равен False (по умолчанию), каждый элемент последовательности выводится на отдельной строке. Если *compact* равен True, на каждой строке выводится столько элементов, сколько помещается в заданную ширину *width*.4041Если *sort\_dicts* равен True (по умолчанию), словари форматируются с отсортированными ключами, в противном случае они отображаются в порядке вставки.4243Если *underscore\_numbers* равен True, целые числа форматируются с символом `_` в качестве разделителя тысяч; в противном случае символы подчёркивания не отображаются (по умолчанию).4445Изменено в версии 3.4: Добавлен параметр *compact*.4647Изменено в версии 3.8: добавлен параметр *sort\_dicts*.4849Изменено в версии 3.10: добавлен параметр *underscore\_numbers*.5051```python52>>> import pprint53>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']54>>> stuff.insert(0, stuff[:])55>>> pp = pprint.PrettyPrinter(indent=4)56>>> pp.pprint(stuff)57[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],58    'spam',59    'eggs',60    'lumberjack',61    'knights',62    'ni']63>>> pp = pprint.PrettyPrinter(width=41, compact=True)64>>> pp.pprint(stuff)65[['spam', 'eggs', 'lumberjack',66  'knights', 'ni'],67 'spam', 'eggs', 'lumberjack', 'knights',68 'ni']69>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',70... ('parrot', ('fresh fruit',))))))))71>>> pp = pprint.PrettyPrinter(depth=6)72>>> pp.pprint(tup)73('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))74```7576Модуль [`pprint`](https://python-all.ru/3.10/library/pprint.html#module-pprint) также предоставляет несколько функций-сокращений:7778#### `pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)`7980Возвращает форматированное представление *object* в виде строки. *indent*, *width*, *depth*, *compact*, *sort\_dicts* и *underscore\_numbers* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter) как параметры форматирования.8182Изменено в версии 3.4: Добавлен параметр *compact*.8384Изменено в версии 3.8: добавлен параметр *sort\_dicts*.8586Изменено в версии 3.10: добавлен параметр *underscore\_numbers*.8788#### `pprint.pp(object, *args, sort_dicts=False, **kwargs)`8990Выводит форматированное представление объекта *object*, за которым следует новая строка. Если *sort\_dicts* равен False (по умолчанию), словари отображаются с ключами в порядке вставки, иначе ключи сортируются. *args* и *kwargs* передаются в [`pprint()`](https://python-all.ru/3.10/library/pprint.html#module-pprint) в качестве параметров форматирования.9192Новое в версии 3.8.9394#### `pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)`9596Выводит форматированное представление *object* в *поток данных*, за которым следует перевод строки. Если *поток данных* равен `None`, используется `sys.stdout`. Это может использоваться в интерактивном интерпретаторе вместо функции [`print()`](https://python-all.ru/3.10/library/functions.html#print) для просмотра значений (можно даже переназначить `print = pprint.pprint` для использования в области видимости). *indent*, *width*, *depth*, *compact*, *sort\_dicts* и *underscore\_numbers* будут переданы конструктору [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter) как параметры форматирования.9798Изменено в версии 3.4: Добавлен параметр *compact*.99100Изменено в версии 3.8: добавлен параметр *sort\_dicts*.101102Изменено в версии 3.10: добавлен параметр *underscore\_numbers*.103104```python105>>> import pprint106>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']107>>> stuff.insert(0, stuff)108>>> pprint.pprint(stuff)109[<Recursion on list with id=...>,110 'spam',111 'eggs',112 'lumberjack',113 'knights',114 'ni']115```116117#### `pprint.isreadable(object)`118119Определяет, является ли форматированное представление *object* «читаемым» или может использоваться для восстановления значения с помощью [`eval()`](https://python-all.ru/3.10/library/functions.html#eval). Для рекурсивных объектов всегда возвращает `False`.120121```python122>>> pprint.isreadable(stuff)123False124```125126#### `pprint.isrecursive(object)`127128Определяет, требует ли объект *object* рекурсивного представления.129130Также определена ещё одна вспомогательная функция:131132#### `pprint.saferepr(object)`133134Возвращает строковое представление объекта *object*, защищённое от рекурсивных структур данных. Если представление *object* обнаруживает рекурсивную запись, рекурсивная ссылка будет представлена как `<Recursion on typename with id=number>`. В остальном представление не форматируется.135136```python137>>> pprint.saferepr(stuff)138"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"139```140141## Объекты PrettyPrinter142143Экземпляры [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter) имеют следующие методы:144145#### `PrettyPrinter.pformat(object)`146147Возвращает отформатированное представление *object*. Учитываются параметры, переданные конструктору [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter).148149#### `PrettyPrinter.pprint(object)`150151Выводит отформатированное представление *object* в настроенный поток, после чего добавляет новую строку.152153Следующие методы предоставляют реализации для соответствующих функций с теми же именами. Использование этих методов на экземпляре немного эффективнее, поскольку не нужно создавать новые объекты [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter).154155#### `PrettyPrinter.isreadable(object)`156157Определяет, является ли форматированное представление объекта «читаемым» или может быть использовано для восстановления значения с помощью [`eval()`](https://python-all.ru/3.10/library/functions.html#eval). Обратите внимание: для рекурсивных объектов возвращается `False`. Если установлен параметр *depth* в [`PrettyPrinter`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter) и объект глубже допустимого, возвращается `False`.158159#### `PrettyPrinter.isrecursive(object)`160161Определяет, требует ли объект рекурсивного представления.162163Этот метод предоставляется как хук, позволяющий подклассам изменять способ преобразования объектов в строки. Реализация по умолчанию использует внутренние механизмы реализации [`saferepr()`](https://python-all.ru/3.10/library/pprint.html#pprint.saferepr).164165#### `PrettyPrinter.format(object, context, maxlevels, level)`166167Возвращает три значения: форматированную версию *object* в виде строки, флаг, указывающий, является ли результат читаемым, и флаг, указывающий, была ли обнаружена рекурсия. Первый аргумент – отображаемый объект. Второй – словарь, содержащий [`id()`](https://python-all.ru/3.10/library/functions.html#id) объектов, которые являются частью текущего контекста представления (прямые и косвенные контейнеры для *object*, влияющие на представление) в качестве ключей; если необходимо отобразить объект, который уже представлен в *context*, третье возвращаемое значение должно быть `True`. Рекурсивные вызовы метода [`format()`](https://python-all.ru/3.10/library/pprint.html#pprint.PrettyPrinter.format) должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, *maxlevels*, задаёт запрошенный лимит рекурсии; он будет равен `0`, если лимит не задан. Этот аргумент должен передаваться рекурсивным вызовам без изменений. Четвёртый аргумент, *level*, указывает текущий уровень; рекурсивные вызовы должны получать значение, меньшее текущего.168169## Пример170171Чтобы продемонстрировать несколько способов использования функции [`pprint()`](https://python-all.ru/3.10/library/pprint.html#module-pprint) и её параметров, получим информацию о проекте из [PyPI](https://python-all.ru/3.10/library/pprint.html):172173```python174>>> import json175>>> import pprint176>>> from urllib.request import urlopen177>>> with urlopen('https://pypi.org/pypi/sampleproject/json') as resp:178...     project_info = json.load(resp)['info']179```180181В своей базовой форме [`pprint()`](https://python-all.ru/3.10/library/pprint.html#module-pprint) отображает весь объект:182183```python184>>> pprint.pprint(project_info)185{'author': 'The Python Packaging Authority',186 'author_email': 'pypa-dev@googlegroups.com',187 'bugtrack_url': None,188 'classifiers': ['Development Status :: 3 - Alpha',189                 'Intended Audience :: Developers',190                 'License :: OSI Approved :: MIT License',191                 'Programming Language :: Python :: 2',192                 'Programming Language :: Python :: 2.6',193                 'Programming Language :: Python :: 2.7',194                 'Programming Language :: Python :: 3',195                 'Programming Language :: Python :: 3.2',196                 'Programming Language :: Python :: 3.3',197                 'Programming Language :: Python :: 3.4',198                 'Topic :: Software Development :: Build Tools'],199 'description': 'A sample Python project\n'200                '=======================\n'201                '\n'202                'This is the description file for the project.\n'203                '\n'204                'The file should use UTF-8 encoding and be written using '205                'ReStructured Text. It\n'206                'will be used to generate the project webpage on PyPI, and '207                'should be written for\n'208                'that purpose.\n'209                '\n'210                'Typical contents for this file would include an overview of '211                'the project, basic\n'212                'usage examples, etc. Generally, including the project '213                'changelog in here is not\n'214                'a good idea, although a simple "What\'s New" section for the '215                'most recent version\n'216                'may be appropriate.',217 'description_content_type': None,218 'docs_url': None,219 'download_url': 'UNKNOWN',220 'downloads': {'last_day': -1, 'last_month': -1, 'last_week': -1},221 'home_page': 'https://github.com/pypa/sampleproject',222 'keywords': 'sample setuptools development',223 'license': 'MIT',224 'maintainer': None,225 'maintainer_email': None,226 'name': 'sampleproject',227 'package_url': 'https://pypi.org/project/sampleproject/',228 'platform': 'UNKNOWN',229 'project_url': 'https://pypi.org/project/sampleproject/',230 'project_urls': {'Download': 'UNKNOWN',231                  'Homepage': 'https://github.com/pypa/sampleproject'},232 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',233 'requires_dist': None,234 'requires_python': None,235 'summary': 'A sample Python project',236 'version': '1.2.0'}237```238239Результат можно ограничить определённой *depth* (для более глубокого содержимого используется многоточие):240241```python242>>> pprint.pprint(project_info, depth=1)243{'author': 'The Python Packaging Authority',244 'author_email': 'pypa-dev@googlegroups.com',245 'bugtrack_url': None,246 'classifiers': [...],247 'description': 'A sample Python project\n'248                '=======================\n'249                '\n'250                'This is the description file for the project.\n'251                '\n'252                'The file should use UTF-8 encoding and be written using '253                'ReStructured Text. It\n'254                'will be used to generate the project webpage on PyPI, and '255                'should be written for\n'256                'that purpose.\n'257                '\n'258                'Typical contents for this file would include an overview of '259                'the project, basic\n'260                'usage examples, etc. Generally, including the project '261                'changelog in here is not\n'262                'a good idea, although a simple "What\'s New" section for the '263                'most recent version\n'264                'may be appropriate.',265 'description_content_type': None,266 'docs_url': None,267 'download_url': 'UNKNOWN',268 'downloads': {...},269 'home_page': 'https://github.com/pypa/sampleproject',270 'keywords': 'sample setuptools development',271 'license': 'MIT',272 'maintainer': None,273 'maintainer_email': None,274 'name': 'sampleproject',275 'package_url': 'https://pypi.org/project/sampleproject/',276 'platform': 'UNKNOWN',277 'project_url': 'https://pypi.org/project/sampleproject/',278 'project_urls': {...},279 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',280 'requires_dist': None,281 'requires_python': None,282 'summary': 'A sample Python project',283 'version': '1.2.0'}284```285286Кроме того, можно указать максимальную ширину *width*. Если длинный объект невозможно разбить, указанная ширина будет превышена:287288```python289>>> pprint.pprint(project_info, depth=1, width=60)290{'author': 'The Python Packaging Authority',291 'author_email': 'pypa-dev@googlegroups.com',292 'bugtrack_url': None,293 'classifiers': [...],294 'description': 'A sample Python project\n'295                '=======================\n'296                '\n'297                'This is the description file for the '298                'project.\n'299                '\n'300                'The file should use UTF-8 encoding and be '301                'written using ReStructured Text. It\n'302                'will be used to generate the project '303                'webpage on PyPI, and should be written '304                'for\n'305                'that purpose.\n'306                '\n'307                'Typical contents for this file would '308                'include an overview of the project, '309                'basic\n'310                'usage examples, etc. Generally, including '311                'the project changelog in here is not\n'312                'a good idea, although a simple "What\'s '313                'New" section for the most recent version\n'314                'may be appropriate.',315 'description_content_type': None,316 'docs_url': None,317 'download_url': 'UNKNOWN',318 'downloads': {...},319 'home_page': 'https://github.com/pypa/sampleproject',320 'keywords': 'sample setuptools development',321 'license': 'MIT',322 'maintainer': None,323 'maintainer_email': None,324 'name': 'sampleproject',325 'package_url': 'https://pypi.org/project/sampleproject/',326 'platform': 'UNKNOWN',327 'project_url': 'https://pypi.org/project/sampleproject/',328 'project_urls': {...},329 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',330 'requires_dist': None,331 'requires_python': None,332 'summary': 'A sample Python project',333 'version': '1.2.0'}334```335