Рубрики
Без рубрики

pprint – структуры данных Pretty-Print

Автор оригинала: 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'])]

Смотрите также