Содержание страницы
8.18. pprint – средство форматированного вывода данных¶pprint – Data pretty printer
Исходный код: Lib/pprint.py
Модуль pprint предоставляет возможность «pretty-печати» произвольных
структур данных Python в форме, которая может использоваться как входные данные для интерпретатора.
Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python,
представление может не загружаться. Это может быть в случае, если включены такие объекты,
как файлы, сокеты, классы или экземпляры, а также многие другие встроенные объекты,
которые не представимы в виде констант Python.
Форматированное представление помещает объекты на одну строку, если возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину. Для изменения ограничения по ширине создавайте объекты PrettyPrinter явно.
Изменено в версии 2.5: Словари сортируются по ключу перед вычислением отображения; до версии 2.5 словарь сортировался, только если его отображение требовало более одной строки, хотя это не было задокументировано.
Модуль pprint определяет один класс:
-
class
pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None)¶ Создаёт экземпляр
PrettyPrinter. Данный конструктор принимает несколько именованных параметров. Выходной поток может быть задан с помощью параметра stream; единственным используемым методом объекта потока является методwrite()протокола файлов. Если не указано,PrettyPrinterиспользуетsys.stdout. Три дополнительных параметра могут использоваться для управления форматированным представлением. Это ключевые слова indent, depth и width. Величина отступа, добавляемого на каждый рекурсивный уровень, задаётся параметром indent; по умолчанию он равен единице. Другие значения могут сделать вывод немного необычным, но могут облегчить выявление вложенности. Количество уровней, которые могут быть напечатаны, контролируется параметром depth; если структура данных слишком глубока, следующий вложенный уровень заменяется на.... По умолчанию глубина форматируемых объектов не ограничена. Желаемая ширина вывода ограничивается параметром width; по умолчанию 80 символов. Если структура не может быть отформатирована в пределах заданной ширины, будет предпринята наилучшая попытка.>>> 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'] >>> 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 поддерживает несколько производных функций:
-
pprint.pformat(object, indent=1, width=80, depth=None)¶ Возвращает отформатированное представление object в виде строки. Параметры indent, width и depth будут переданы конструктору
PrettyPrinterв качестве параметров форматирования.Изменено в версии 2.4: Параметры indent, width и depth были добавлены.
-
pprint.pprint(object, stream=None, indent=1, width=80, depth=None)¶ Печатает отформатированное представление object в поток данных stream, после чего добавляет новую строку. Если поток данных stream равен
None, используетсяsys.stdout. Это может использоваться в интерактивном интерпретаторе вместо оператораprintдля просмотра значений. Параметры indent, width и depth будут переданы конструкторуPrettyPrinterв качестве параметров форматирования.>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) >>> pprint.pprint(stuff) [<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']
Изменено в версии 2.4: Параметры indent, width и depth были добавлены.
-
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']"
8.18.1. Объекты PrettyPrinter¶PrettyPrinter Objects
Экземпляры 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()объектов, которые являются частью текущего контекста представления (прямые и косвенные контейнеры для object, влияющие на представление) в качестве ключей; если необходимо отобразить объект, который уже представлен в context, третье возвращаемое значение должно бытьTrue. Рекурсивные вызовы методаformat()должны добавлять дополнительные записи для контейнеров в этот словарь. Третий аргумент, maxlevels, задаёт запрошенный лимит рекурсии; он будет равен0, если лимит не задан. Этот аргумент должен передаваться рекурсивным вызовам без изменений. Четвёртый аргумент, level, указывает текущий уровень; рекурсивные вызовы должны получать значение, меньшее текущего.Новое в версии 2.3.
8.18.2. Пример pprint¶pprint Example
Этот пример демонстрирует несколько вариантов использования функции pprint() и её
параметров.
>>> import pprint
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> stuff = ['a' * 10, tup, ['a' * 30, 'b' * 30], ['c' * 20, 'd' * 20]]
>>> pprint.pprint(stuff)
['aaaaaaaaaa',
('spam',
('eggs',
('lumberjack',
('knights', ('ni', ('dead', ('parrot', ('fresh fruit',)))))))),
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
['cccccccccccccccccccc', 'dddddddddddddddddddd']]
>>> pprint.pprint(stuff, depth=3)
['aaaaaaaaaa',
('spam', ('eggs', (...))),
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
['cccccccccccccccccccc', 'dddddddddddddddddddd']]
>>> pprint.pprint(stuff, width=60)
['aaaaaaaaaa',
('spam',
('eggs',
('lumberjack',
('knights',
('ni', ('dead', ('parrot', ('fresh fruit',)))))))),
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'],
['cccccccccccccccccccc', 'dddddddddddddddddddd']]