Pular para o conteúdo

Como usar o Python Pretty Printer?

[

Prettificar suas estruturas de dados com Pretty Print no Python

por Ian Currie 3 comentários intermediário python

Dealing with data is essential for any Pythonista, but sometimes that data is just not very pretty. Computers don’t care about formatting, but without good formatting, humans may find something hard to read. The output isn’t pretty when you use print() on large dictionaries or long lists—it’s efficient, but not pretty.

O módulo pprint no Python é um utilitário que você pode usar para imprimir estruturas de dados de maneira legível e bonita. É parte da biblioteca padrão e é especialmente útil para depurar código que lida com requisições de API, arquivos JSON grandes e dados em geral.

Ao final deste tutorial, você vai:

  • Entender por que o módulo pprint é necessário
  • Aprender a usar pprint(), PrettyPrinter e seus parâmetros
  • Ser capaz de criar sua própria instância do PrettyPrinter
  • Salvar a saída de uma string formatada em vez de imprimi-la
  • Imprimir e reconhecer estruturas de dados recursivas

Bônus grátis: Clique aqui para acessar um Python Cheat Sheet e aprender o básico do Python 3, como trabalhar com tipos de dados, dicionários, listas e funções Python.

Entendendo a necessidade do Pretty Print no Python

Antes de começar a explorar o pprint, você vai usar o urllib para fazer uma requisição e obter alguns dados. Você fará uma requisição para o {JSON} Placeholder para obter algumas informações falsas de usuários. Primeiro, faça uma requisição HTTP GET e coloque a resposta em um dicionário:

Python

from urllib import request
response = request.urlopen("https://jsonplaceholder.typicode.com/users")
json_response = response.read()
import json
users = json.loads(json_response)

Aqui, você faz uma requisição básica GET e em seguida faz o parsing da resposta em um dicionário usando json.loads(). Com o dicionário agora em uma variável, o próximo passo comum é imprimir o conteúdo usando print():

Python

print(users)

O resultado será um dicionário longo e não formatado que pode ser difícil de ler. É aí que entra o pprint. Ele permite formatar a saída do seu dicionário de uma maneira mais agradável aos olhos:

Python

import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(users)

Ao usar o pprint para imprimir o dicionário, você obtém uma saída muito mais legível, com a indentação correta e quebras de linha adequadas. Isso torna a leitura e a compreensão dos dados muito mais fáceis.

Mas o pprint não se limita apenas a dicionários. Ele pode ser usado para estruturas de dados complexas, como listas aninhadas, tuplas e até mesmo objetos personalizados. Ele é capaz de lidar com praticamente qualquer estrutura de dados que você possa ter.

Trabalhando com pprint

Agora que você tem uma ideia básica de como o pprint pode ajudar a melhorar a formatação dos seus dados, vamos dar uma olhada mais de perto nas funções principais que ele oferece: pprint() e PrettyPrinter().

Utilizando pprint()

A função pprint() é a maneira mais simples de usar o pprint. Ela aceita qualquer estrutura de dados e imprime-a formatada:

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"hobbies": ["leitura", "viagens", "cozinhar"],
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
pprint.pprint(data)

A saída será uma versão formatada dos dados, como esta:

{
'nome': 'Marcela',
'idade': 30,
'hobbies': ['leitura', 'viagens', 'cozinhar'],
'endereco': {
'rua': 'Rua das Flores',
'numero': 123,
'cidade': 'São Paulo'
}
}

Explorando os parâmetros opcionais do pprint()

O pprint também possui vários parâmetros opcionais que você pode usar para personalizar a saída formatada. Alguns dos parâmetros mais úteis incluem:

Resumindo seus dados: depth

O parâmetro depth controla a profundidade máxima de recursão nos seus dados. Por padrão, depth=None, o que significa que ele irá imprimir a estrutura completa dos seus dados, independentemente de quão aninhados eles estejam. No entanto, você pode definir um valor inteiro para limitar a profundidade de impressão.

Python

import pprint
data = {
"pessoa1": {
"nome": "Marcela",
"idade": 30,
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
},
"pessoa2": {
"nome": "João",
"idade": 25,
"endereco": {
"rua": "Rua das Árvores",
"numero": 456,
"cidade": "Rio de Janeiro"
}
}
}
pprint.pprint(data, depth=1)

A saída será limitada apenas ao primeiro nível de aninhamento dos dados:

{'pessoa1': {...}, 'pessoa2': {...}}

Dando espaço aos seus dados: indent

O parâmetro indent controla o número de espaços utilizados para a indentação da saída. O valor padrão é 1, mas você pode ajustá-lo para a quantidade desejada.

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"hobbies": ["leitura", "viagens", "cozinhar"],
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
pprint.pprint(data, indent=2)

A saída terá uma maior indentação:

{
'nome': 'Marcela',
'idade': 30,
'hobbies': ['leitura', 'viagens', 'cozinhar'],
'endereco': {
'rua': 'Rua das Flores',
'numero': 123,
'cidade': 'São Paulo'
}
}

Limitando o comprimento das linhas: width

O parâmetro width define o número máximo de caracteres permitidos por linha ao imprimir a saída. Se um dicionário ou lista for muito longo para caber em uma única linha dentro do limite de comprimento, ele será quebrado em várias linhas.

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"hobbies": [
"leitura", "viagens", "cozinhar", "fotografia",
"correr", "pintar", "jogar"
],
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
pprint.pprint(data, width=30)

A saída será:

{'endereco': {'cidade': 'São Paulo',
'numero': 123,
'rua': 'Rua das Flores'},
'hobbies': ['leitura',
'viagens',
'cozinhar',
'fotografia',
'correr',
'pintar',
'jogar'],
'idade': 30,
'nome': 'Marcela'}

A lista de hobbies foi quebrada em várias linhas, para que não ultrapassasse o limite de 30 caracteres por linha.

Squeezing suas sequências longas: compact

Quando você tem sequências longas, como listas ou tuplas com muitos elementos, o pprint pode compactá-las e exibir apenas alguns elementos no meio, usando reticências para indicar que há mais elementos. O parâmetro compact controla a exibição dessa compressão das sequências longas.

Python

import pprint
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pprint.pprint(data, compact=True)

A saída será:

[1, 2, 3, 4, 5, ..., 10]

A sequência foi compactada para mostrar apenas os primeiros 5 elementos e o último elemento.

Direcionando sua saída: stream

Por padrão, o pprint imprime a saída no console, mas você pode direcionar a saída para qualquer objeto de fluxo com o parâmetro stream. Isso permite salvar a saída formatada em um arquivo, por exemplo.

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"hobbies": ["leitura", "viagens", "cozinhar"],
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
with open("output.txt", "w") as f:
pp = pprint.PrettyPrinter(stream=f)
pp.pprint(data)

Neste exemplo, a saída formatada será salva no arquivo output.txt.

Evitando a ordenação de dicionários: sort_dicts

Por padrão, o pprint ordena dicionários alfabeticamente pela chave antes de imprimi-los. Para manter a ordem original dos dicionários, você pode definir o parâmetro sort_dicts como False.

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
pprint.pprint(data, sort_dicts=False)

A saída manterá a ordem original dos dicionários:

{
'nome': 'Marcela',
'idade': 30,
'endereco': {
'rua': 'Rua das Flores',
'numero': 123,
'cidade': 'São Paulo'
}
}

Deixando seus números bonitos: underscore_numbers

O parâmetro underscore_numbers recebe um valor booleano. Quando definido como True, ele adiciona um sublinhado (_) entre os dígitos de números inteiros, tornando-os mais legíveis.

Python

import pprint
data = {
"valor": 1000000,
"populacao": 10000000,
"preco": 19.99
}
pprint.pprint(data, underscore_numbers=True)

A saída será:

{'preco': 19.99, 'populacao': 10_000_000, 'valor': 1_000_000}

Os números foram formatados com sublinhados para melhorar a legibilidade.

Criando um objeto PrettyPrinter personalizado

Além de utilizar a função pprint(), você também pode criar um objeto PrettyPrinter personalizado para ter ainda mais controle sobre a formatação dos seus dados. O PrettyPrinter permite ajustar os mesmos parâmetros mencionados anteriormente, mas de uma maneira mais flexível.

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"hobbies": ["leitura", "viagens", "cozinhar"],
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
pp = pprint.PrettyPrinter(indent=4, depth=2, compact=True)
pp.pprint(data)

Neste exemplo, você cria um objeto PrettyPrinter personalizado com indentação de 4 espaços, profundidade de 2 níveis, e compactação habilitada. Em seguida, você usa o método pprint() para imprimir a saída formatada.

Obtendo uma string formatada com pformat()

Além de imprimir a saída formatada diretamente no console ou em um arquivo, o pprint também permite que você obtenha a saída como uma string formatada usando o método pformat().

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"hobbies": ["leitura", "viagens", "cozinhar"],
"endereco": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
formatted_data = pprint.pformat(data)
print(formatted_data)

Neste exemplo, você obtém a saída formatada do pprint e a atribui à variável formatted_data. Depois, você imprime essa variável para exibir a string formatada.

Lidando com estruturas de dados recursivas

O pprint é capaz de lidar sem problemas com estruturas de dados recursivas, como listas aninhadas ou dicionários que contêm dicionários. Ele identifica automaticamente estruturas de dados recursivas e as trata com a formatação adequada.

Python

import pprint
data = {
"nome": "Marcela",
"idade": 30,
"amigos": [
{
"nome": "João",
"idade": 25
},
{
"nome": "Maria",
"idade": 28
}
]
}
pprint.pprint(data)

A saída será formatada corretamente, com a indentação e quebras de linha corretas para exibir a estrutura aninhada:

{'amigos': [{'idade': 25, 'nome': 'João'}, {'idade': 28, 'nome': 'Maria'}],
'idade': 30,
'nome': 'Marcela'}

Conclusão

O módulo pprint no Python é uma ferramenta poderosa para melhorar a legibilidade da saída de estruturas de dados. Ele nos fornece maneiras de formatar e imprimir nossos dados de forma bonita e legível. Além disso, ele também oferece opções para personalizar a saída e lidar com estruturas de dados complexas, como listas aninhadas e dicionários.

Ao utilizar o pprint, você poderá visualizar seus dados de forma mais clara, depurar seu código com mais facilidade e melhorar a experiência de visualização dos usuários para quem você compartilha suas informações.

Agora que você entende como usar o pprint, experimente aplicá-lo nas suas próprias estruturas de dados para obter uma saída mais bonita e legível.