Функции pprint() и pformat(). Класс PrettyPrinter

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

На этом занятии мы с вами рассмотрим довольно простой, но полезный модуль pprint («pretty print»), предназначенный для визуально удобного вывода объемных структур данных, таких как, списков, словарей, кортежей и т. п.

Базовой функцией для вывода информации на экран (в стандартный поток вывода) является функция pprint().Она автоматически добавляет отступы, разбивает строки и делает вывод более наглядным.

Пусть, например, в программе имеется словарь вида:

import pprint
 
d_eng = {'tree': ['дерево'], 'car': ['машина', 'автомобиль'], 'leaf': ['лист'], 
         'river': ['река'], 'go': ['идти', 'ехать', 'ходить'], 'milk': ['молоко']}

Выведем его с помощью функции pprint:

pprint.pprint(d_eng)

В консоли увидим:
{'car': ['машина', 'автомобиль'],
 'go': ['идти', 'ехать', 'ходить'],
 'leaf': ['лист'],
 'milk': ['молоко'],
 'river': ['река'],
 'tree': ['дерево']}

Смотрите, как удобно для визуального восприятия отображен словарь d_eng. В действительности функция pprint() последовательно проходит по переданному ей объекту и выводит его содержимое так, чтобы каждый элемент был аккуратно представлен и выровнен. Для каждого элемента нового уровня добавляется дополнительный отступ, облегчающий восприятие иерархических данных.

Параметры функции pprint()

Стандартное поведение функции pprint() можно менять, используя ряд полезных настроек (параметров функции), позволяющих тонко настраивать вывод различных данных. Основные из них следующие:

  • stream=None: задает выходной поток (по умолчанию stdout);
  • indent=1: количество символов отступа для каждого уровня вложенности;
  • width=80: максимальная ширина вывода;
  • depth=None: максимальная глубина рекурсии (если значение задано, уровни ниже указанного обрезаются);
  • sort_dicts=True/False: порядок следования элементов словаря (начиная с Python 3.8 по умолчанию True, в более ранних версиях False).

Давайте посмотрим, как используются некоторые из этих параметров. Пусть у нас по-прежнему имеется словарь следующего вида:

dp = {'coords': (100, 200, 300, 400, 500, 600, 700, 1024),
      'matrix': [(1, 2, 3, 4, 5, 6), (1, 2, 3, 4, 5, 6), (1, 2, 3, 4, 5, 6), (-1, -2, -3, -4, -5, -6)],
      'x': 6.54,
      'y': 10.23,
      (10, 20): 'coords of the point'
}

Выведем его с помощью функции pprint() с настройками по умолчанию:

pprint.pprint(dp)

Увидим результат:

{'coords': (100, 200, 300, 400, 500, 600, 700, 1024),
 'matrix': [(1, 2, 3, 4, 5, 6),
            (1, 2, 3, 4, 5, 6),
            (1, 2, 3, 4, 5, 6),
            (-1, -2, -3, -4, -5, -6)],
 'x': 6.54,
 'y': 10.23,
 (10, 20): 'coords of the point'}

Теперь, если прописать:

pprint.pprint(dp, indent=5) # вложенные элементы сдвигаются на 5 пробелов
pprint.pprint(dp, indent=2, width=40) # максимальная ширина вывода 40 символов
pprint.pprint(dp, depth=2) # вложения больше двух заменяются на ...

Как видите, использование функции pprint() значительно упрощает работу с большими вложенными структурами данных. Она идеально подходит для ситуаций, когда нужно быстро проанализировать структуру объекта и увидеть взаимосвязи между элементами. Особенно полезна эта функция при отладке и тестировании кода, поскольку данные выводятся в удобной для восприятия форме.

Функция pformat()

Следующая полезная функция pformat() из модуля pprint работает по аналогии с функцией pprint(), но выводит данные не в консоль, а формирует вывод в строку. Её основное назначение – создание красивой и читаемой строки, представляющей сложный объект (списки, словари, классы и т.п.) с возможностью последующей обработки или сохранения результата.

Если для словаря dp вызвать функцию pformat():

s = pprint.pformat(dp)

то будет возвращена строка с тем же содержимым, которое мы видели при работе функции pprint(). В этом легко убедиться, если вывести строку s в консоль обычной функцией print():

print(s)

Функция pformat() имеет практически тот же набор параметров, что и функция pprint(). Например:

s = pprint.pformat(dp, width=50, depth=2)

Функция pformat() даёт возможность создавать аккуратные и красивые строки-представления объектов, предоставляя широкий спектр возможностей для настройки формата вывода. Отличная альтернатива встроенным средствам вроде repr() или стандартной сериализации в JSON, особенно когда важна красота и удобство чтения выводимых данных.

Класс PrettyPrinter

Иногда в программах удобно сформировать объект со всеми необходимыми настройками для красивого вывода данных. Как раз для этого предназначен класс PrettyPrinter модуля pprint. Мы можем создать его объект, указав желаемые значения параметров, например:

pr = pprint.PrettyPrinter(indent=2, depth=3, width=70, compact=True)

А, затем, использовать его для вывода данных с этими настройками:

s = pr.pformat(dp) # вывод в строку
pr.pprint(dp) # вывод в консоль

Как видите, модуль pprint предоставляет нам довольно удобные функции и класс для красивого форматированного вывода информации о различных объектах в консоль, строку или файл.

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме