Pular para o conteúdo

Como Usar o Python pprint Facilmente?

[

Embeleze suas estruturas de dados com Python Pretty Print

por Ian Currie 3 Comentários intermediário python

Compreendendo a necessidade do Python Pretty Print

Lidar com dados é essencial para qualquer Pythonista, mas às vezes esses dados não são muito bonitos. Os computadores não se importam com a formatação, mas os humanos podem ter dificuldade em ler algo sem uma boa formatação. A saída não é bonita quando você usa print() em dicionários grandes ou listas longas - é eficiente, mas não é bonito.

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

Ao final deste tutorial, você irá:

  • Compreender 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 string formatada em vez de imprimi-la
  • Imprimir e reconhecer estruturas de dados recursivas

Bônus Gratuito: Clique aqui para obter 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.

Compreendendo a necessidade do Python Pretty Print

Antes de começar a explorar o pprint, você primeiro usará o urllib para fazer uma solicitação para obter alguns dados. Você fará uma solicitação para o {JSON} Placeholder para obter algumas informações fictícias de usuários. A primeira coisa a fazer é fazer a solicitação GET HTTP e colocar 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 solicitação GET básica e, em seguida, analisa a resposta em um dicionário com json.loads(). Com o dicionário agora em uma variável, um próximo passo comum é imprimir o conteúdo com print():

Python

print(users)

Resultado:

[{'id': 1, 'name': 'Leanne Graham', 'username': 'Bret', 'email': 'Sincere@april.biz', 'address': {'street': 'Kulas Light', 'suite': 'Apt. 556', 'city': 'Gwenborough', 'zipcode': '92998-3874', 'geo': {'lat': '-37.3159', 'lng': '81.1496'}}, 'phone': '1-770-736-8031 x56442', 'website': 'hildegard.org', 'company': {'name': 'Romaguera-Crona', 'catchPhra

Você pode ver que a saída é uma única linha e não é fácil de ler. É aí que o pprint entra em ação.

Trabalhando com pprint

O pprint é uma ferramenta poderosa para formatar a saída de estruturas de dados em Python. Ele é usado principalmente para melhorar a legibilidade ao imprimir dicionários, listas e outras estruturas de dados complexas. Para usar o pprint, primeiro você precisa importá-lo do módulo pprint:

Python

from pprint import pprint

A função pprint() pode ser usada para imprimir uma estrutura de dados em um formato mais legível:

Python

pprint(users)

Resultado:

[{'address': {'city': 'Gwenborough',
'geo': {'lat': '-37.3159', 'lng': '81.1496'},
'street': 'Kulas Light',
'suite': 'Apt. 556',
'zipcode': '92998-3874'},
'company': {'catchPhrase': 'Multi-layered client-server neural-net',
'name': 'Romaguera-Crona'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'}]

Agora você pode ver que a saída está formatada de maneira mais legível, com cada item em uma linha separada e com as estruturas aninhadas indentadas.

O pprint() também pode ser usado para formatar outros tipos de dados, como listas:

Python

numbers = [1, 2, 3, 4, 5]
pprint(numbers)

Resultado:

[1, 2, 3, 4, 5]

Neste caso, como a estrutura de dados é simples, a saída formatada não é muito diferente da saída usando print(), mas o pprint() ainda fornece uma formatação mais consistente em diferentes situações.

Explorando Parâmetros Opcionais do pprint()

A função pprint() também possui vários parâmetros opcionais que permitem personalizar a formatação da saída. Esses parâmetros permitem ajustar a quantidade de detalhes, o espaçamento, o comprimento da linha e muito mais. Vamos explorar alguns desses parâmetros.

Resumindo seus dados: depth

O parâmetro depth controla a profundidade máxima em que o pprint() imprime estruturas de dados aninhadas. Ela limita a profundidade que o pprint() desce na estrutura para imprimir. O valor padrão é None, o que significa que o pprint() explora recursivamente a estrutura de dados.

Vamos ver isso em ação usando o seguinte exemplo:

Python

data = {
'name': 'John',
'age': 30,
'car': {
'make': 'Ford',
'model': 'Mustang',
'year': 2020
}
}
pprint(data, depth=1)

Resultado:

{'age': 30, 'car': {...}, 'name': 'John'}

Aqui, definimos depth=1, o que significa que o pprint() só imprimirá até o primeiro nível de aninhamento. A saída mostra ... para indicar que existe mais profundidade na estrutura que não foi impressa.

Dando espaço aos seus dados: indent

O parâmetro indent controla a quantidade de espaçamento usado para os níveis de aninhamento. O valor padrão é 1, que fornece uma indentação básica. Você pode aumentar esse valor para ter mais espaçamento ou diminuí-lo para ter menos espaçamento.

Vamos usar o exemplo anterior e definir indent=2:

Python

pprint(data, indent=2)

Resultado:

{
'age': 30,
'car': {
'make': 'Ford',
'model': 'Mustang',
'year': 2020
},
'name': 'John'
}

Agora a saída está mais espaçada e torna as estruturas de dados aninhadas mais fáceis de serem identificadas.

Limitando o comprimento das linhas: width

O parâmetro width controla o comprimento máximo de uma única linha de saída. O valor padrão é 80. Se a estrutura de dados ultrapassar esse comprimento, o pprint() dividirá a linha em várias linhas.

Vamos usar um exemplo com uma lista de números grandes e definir um width menor:

Python

numbers = list(range(100000))
pprint(numbers, width=50)

Resultado:

[0,
1,
2,
3,
4,
5,
6,
7,
8,
...
99999]

Aqui, definimos width=50, o que significa que cada linha de saída terá um comprimento máximo de 50 caracteres. Quando a lista é impressa, ela é dividida em várias linhas para se ajustar ao limite de largura definido.

Comprimindo suas sequências longas: compact

O parâmetro compact controla como o pprint() lida com sequências longas, como listas e tuplas. O valor padrão é False, que leva a uma saída compacta, mas difícil de ler. Quando compact é definido como True, o pprint() tenta quebrar a sequência em várias linhas para uma melhor legibilidade.

Vamos ver isso em ação com o seguinte exemplo:

Python

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

Resultado:

[1, 2, 3, 4, 5,
6, 7, 8, 9, 10]

Aqui, definimos compact=True, fazendo com que cada item da lista seja impresso em uma linha separada para melhorar a legibilidade.

Direcionando sua saída: stream

O parâmetro stream controla para onde o pprint() direciona a saída. O valor padrão é None, o que significa que a saída é impressa no sys.stdout. No entanto, você pode definir um objeto de fluxo personalizado para direcionar a saída para outros locais, como arquivos.

Vamos usar um exemplo onde redirecionamos a saída para um arquivo:

Python

with open('output.txt', 'w') as f:
pprint(data, stream=f)

Neste exemplo, a saída do pprint() é direcionada para o arquivo output.txt em vez de ser impressa no console.

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

O parâmetro sort_dicts controla se os dicionários devem ser ordenados alfabeticamente pela chave ao imprimir. O valor padrão é True, o que significa que os dicionários serão ordenados. Se você definir sort_dicts=False, os dicionários serão impressos na ordem em que foram definidos, sem nenhuma ordenação adicional.

Vamos usar um exemplo com um dicionário e definir sort_dicts=False:

Python

data = {'b': 2, 'a': 1, 'c': 3}
pprint(data, sort_dicts=False)

Resultado:

{'b': 2, 'a': 1, 'c': 3}

Aqui, definimos sort_dicts=False, então o dicionário é impresso na ordem em que as chaves foram definidas, em vez de ser ordenado alfabeticamente.

Embelezando seus números: underscore_numbers

O parâmetro underscore_numbers controla se os números devem ser impressos com underscores para melhor legibilidade. O valor padrão é False. Quando underscore_numbers=True, os números são impressos com underscores em posições estratégicas para facilitar a leitura.

Vamos usar um exemplo com números longos e definir underscore_numbers=True:

Python

number = 1000000
pprint(number, underscore_numbers=True)

Resultado:

1_000_000

Aqui, definimos underscore_numbers=True, então o número é impresso com underscores para separar as centenas, milhares, milhões, etc., para uma melhor legibilidade.

Criando um objeto PrettyPrinter personalizado

Além de usar a função pprint(), você também pode criar seu próprio objeto PrettyPrinter personalizado com configurações específicas de formatação. Isso é útil se você estiver trabalhando em um projeto específico que precisa consistentemente de uma determinada formatação.

Aqui está um exemplo de como criar um objeto PrettyPrinter personalizado:

Python

from pprint import PrettyPrinter
my_printer = PrettyPrinter(width=30, depth=2)
my_printer.pprint(data)

Neste exemplo, criamos um objeto PrettyPrinter chamado my_printer com um comprimento máximo de linha de 30 e uma profundidade máxima de 2. Em seguida, usamos o método pprint() desse objeto para imprimir os dados com as configurações personalizadas.

Obtendo uma string bonita com pformat()

Além de imprimir diretamente o objeto em uma saída, o pprint também oferece o método pformat() que retorna uma string formatada que pode ser salva em uma variável para uso posterior.

Aqui está um exemplo de como obter uma string formatada com pformat():

Python

from pprint import pformat
formatted_data = pformat(data)
print(formatted_data)

Resultado:

[{'age': 30,
'car': {'make': 'Ford',
'model': 'Mustang',
'year': 2020},
'name': 'John'}]

Aqui, usamos o pformat() para obter a saída formatada em uma string chamada formatted_data. Em seguida, imprimimos a string que contém a saída formatada.

Lidando com estruturas de dados recursivas

O pprint também é capaz de lidar com estruturas de dados recursivas, como listas ou dicionários que se referem a si mesmos. Ele é capaz de detectar esse tipo de recursão e evitar cair em um loop infinito.

Vamos ver um exemplo de recursão com uma lista que se refere a si mesma:

Python

my_list = []
my_list.append(my_list)
pprint(my_list)

Resultado:

[[...]]

Aqui, criamos uma lista vazia e adicionamos a própria lista a ela. Quando imprimimos a lista usando pprint(), a recursão é detectada e é mostrado [[...]] para indicar a referência à própria lista.

Conclusão

O módulo pprint do Python é uma ferramenta fantástica para embelezar a saída de estruturas de dados em Python. Ele fornece uma maneira fácil de imprimir e ler estruturas de dados complexas, tornando a depuração e a exploração de dados muito mais fáceis. Agora você pode usar o pprint para tornar suas estruturas de dados mais legíveis e esteticamente agradáveis. Experimente diferentes parâmetros e veja como você pode personalizar a saída de acordo com suas necessidades.

Não hesite em explorar a documentação oficial do Python sobre o pprint para saber mais sobre todos os recursos e opções disponíveis.

Agora você tem mais uma ferramenta em seu arsenal Python para ajudar a tornar seu código mais bonito e legível.