Автор оригинала: Doug Hellmann.
Цель:
Довольно печатные структуры данных
Модуль pprint
содержит “красивый принтер” для создания эстетически приятных представлений структур данных. Средство форматирования создает представления структур данных, которые могут быть правильно проанализированы интерпретатором, а также легко читаются человеком. Вывод хранится в одной строке, если это возможно, и с отступом при разделении на несколько строк.
Все примеры в этом разделе зависят от pprint_data.py
, который показан здесь.
pprint_data.py
data [ (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']), ]
Печать
Самый простой способ использовать модуль – использовать функцию pprint ()
.
pprint_pprint.py
from pprint import pprint from pprint_data import data print('PRINT:') print(data) print() print('PPRINT:') pprint(data)
pprint ()
форматирует объект и записывает его в поток данных, переданный в качестве аргумента (или sys.stdout
по умолчанию).
$ python3 pprint_pprint.py PRINT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), ( 3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])] PPRINT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]
Форматирование
Чтобы отформатировать структуру данных, не записывая ее непосредственно в поток (например, для ведения журнала), используйте pformat ()
для построения строкового представления.
pprint_pformat.py
import logging from pprint import pformat from pprint_data import data logging.basicConfig( levellogging.DEBUG, format'%(levelname)-8s %(message)s', ) logging.debug('Logging pformatted data') formatted pformat(data) for line in formatted.splitlines(): logging.debug(line.rstrip())
Затем отформатированную строку можно независимо распечатать или записать в журнал.
$ python3 pprint_pformat.py DEBUG Logging pformatted data DEBUG [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), DEBUG (2, DEBUG {'e': 'E', DEBUG 'f': 'F', DEBUG 'g': 'G', DEBUG 'h': 'H', DEBUG 'i': 'I', DEBUG 'j': 'J', DEBUG 'k': 'K', DEBUG 'l': 'L'}), DEBUG (3, ['m', 'n']), DEBUG (4, ['o', 'p', 'q']), DEBUG (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]
Произвольные классы
Класс PrettyPrinter
, используемый pprint ()
, также может работать с пользовательскими классами, если они определяют метод __repr __ ()
.
pprint_arbitrary_object.py
from pprint import pprint class node: def __init__(self, name, contents[]): self.name name self.contents contents[:] def __repr__(self): return ( 'node(' + repr(self.name) + ', ' + repr(self.contents) + ')' ) trees [ node('node-1'), node('node-2', [node('node-2-1')]), node('node-3', [node('node-3-1')]), ] pprint(trees)
Представления вложенных объектов объединяются PrettyPrinter
для возврата полного строкового представления.
$ python3 pprint_arbitrary_object.py [node('node-1', []), node('node-2', [node('node-2-1', [])]), node('node-3', [node('node-3-1', [])])]
Рекурсия
Рекурсивные структуры данных представлены со ссылкой на исходный источник данных в формате
pprint_recursion.py
from pprint import pprint local_data ['a', 'b', 1, 2] local_data.append(local_data) print('id(local_data) =>', id(local_data)) pprint(local_data)
В этом примере список local_data
добавляется к самому себе, создавая рекурсивную ссылку.
$ python3 pprint_recursion.py id(local_data) => 4358913288 ['a', 'b', 1, 2,]
Ограничение вложенного вывода
Для очень глубоких структур данных может быть нежелательно, чтобы вывод содержал все детали. Данные могут быть отформатированы неправильно, форматированный текст может быть слишком большим для управления или некоторые данные могут быть посторонними.
pprint_depth.py
from pprint import pprint from pprint_data import data pprint(data, depth1) pprint(data, depth2)
Используйте аргумент depth
, чтобы контролировать, насколько глубоко во вложенной структуре данных рекурсивно проходит красивый принтер. Уровни, не включенные в вывод, представлены многоточием.
$ python3 pprint_depth.py [(...), (...), (...), (...), (...)] [(1, {...}), (2, {...}), (3, [...]), (4, [...]), (5, [...])]
Управление шириной вывода
Ширина вывода по умолчанию для форматированного текста составляет 80 столбцов. Чтобы настроить эту ширину, используйте аргумент width
для pprint ()
.
pprint_width.py
from pprint import pprint from pprint_data import data for width in [80, 5]: print('WIDTH =', width) pprint(data, widthwidth) print()
Когда ширина слишком мала для размещения отформатированной структуры данных, строки не усекаются и не обертываются, если это приведет к недопустимому синтаксису.
$ python3 pprint_width.py WIDTH = 80 [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])] WIDTH = 5 [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]
Флаг compact
сообщает pprint ()
, что нужно попытаться уместить больше данных в каждую отдельную строку, а не распределять сложные структуры данных по строкам.
pprint_compact.py
from pprint import pprint from pprint_data import data print('DEFAULT:') pprint(data, compactFalse) print('\nCOMPACT:') pprint(data, compactTrue)
В этом примере показано, что когда структура данных не помещается в строке, она разделяется (как и второй элемент в списке данных). Когда несколько элементов могут поместиться на одной линии, как в случае с третьим и четвертым членами, они размещаются таким образом.
$ python3 pprint_compact.py DEFAULT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])] COMPACT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]
Смотрите также