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

8.18. pprint – средство форматированного вывода данныхpprint – Data pretty printer

Исходный код: Lib/pprint.py


Модуль pprint предоставляет возможность «pretty-печати» произвольных структур данных Python в форме, которая может использоваться как входные данные для интерпретатора. Если отформатированные структуры содержат объекты, не являющиеся фундаментальными типами Python, представление может не загружаться. Это может быть в случае, если включены такие объекты, как файлы, сокеты, классы или экземпляры, а также многие другие встроенные объекты, которые не представимы в виде констант Python.

Форматированное представление помещает объекты на одну строку, если возможно, и разбивает их на несколько строк, если они не помещаются в заданную ширину. Для изменения ограничения по ширине создавайте объекты PrettyPrinter явно.

Изменено в версии 2.5: Словари сортируются по ключу перед вычислением отображения; до версии 2.5 словарь сортировался, только если его отображение требовало более одной строки, хотя это не было задокументировано.

Изменено в версии 2.6: Добавлена поддержка set и frozenset.

Модуль 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. Объекты PrettyPrinterPrettyPrinter 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. Пример pprintpprint 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']]