Python Debugger:Melhore sem esforço suas habilidades de depuração

Depurar código Python, para muitos de nós, se resume a adicionar instruções de impressão e tentar raciocinar o que está acontecendo com base na saída. Não é o ideal, mas por algum motivo, as pessoas simplesmente não querem tocar no depurador Python.
Índice
Usando print para depurar código
Se você é uma daquelas pessoas que usam
print
para depuração, não estou julgando você . Aprender Python é difícil. Programar é difícil. A vida é difícil. Eu entendo que aprender mais uma coisa parece cansativo se você já está lutando. E adicionar essa instrução de impressão ao seu código… é apenas mais fácil. Uma pequena confissão:eu ainda faço isso o tempo todo também. Não é tão ruim quanto alguns fazem parecer. Dito isso, vou te ensinar um pequeno truque que será tão fácil quanto adicionar instruções de impressão ao seu código. No entanto, esse truque oferece infinitos poderes de depuração e permitirá que você conquiste o mundo, caso precise.
Definindo um ponto de interrupção do depurador Python
Você não precisa de um IDE para depurar seu código corretamente. Esse truque sempre funciona, mesmo no editor mais simples e até mesmo em Jupyter Notebooks.
O truque se resume a isso:definir um chamado ponto de interrupção usando a instrução
breakpoint()
. Você pode inseri-lo em seu código, não importa qual editor ou IDE você esteja usando, no ponto em que você normalmente colocaria essa instrução de impressão irritante. Então, o que acontece quando você faz isso? Vamos descobrir! Crie um programa simples, como o abaixo:
def add_two(x): return x + 2 for i in range(1, 10): a = add_two(i) breakpoint() print(a)
Quando você executa isso, e não importa se você faz isso no REPL, na linha de comando ou em seu IDE, você cai no depurador Python chamado PDB. Mas e agora?
Usando o depurador Python
Quando eu inicio o pequeno programa acima, isso é o que acontece:
$ python3 breakpointing.py > /home/erik/breakpointing.py(7)<module>() -> print(a) (Pdb)_
Há algumas coisas para ver aqui:
- Mostra o arquivo atual que foi iniciado (
breakpointing.py
) - Depois disso, mostra o próximo comando que estava prestes a ser executado, mas foi interrompido pela chamada para
breakpoint()
. - E, finalmente, vemos o prompt do pdb, aguardando nossa entrada.
O depurador Python é, na verdade, um shell Python totalmente funcional, assim como o REPL.
Neste ponto, podemos inspecionar o ambiente atual. Vamos ver qual é o valor de
a
é agora:(Pdb) print(a) 3 (Pdb) print(i) 1
Em vez de imprimir, você também pode usar o comando específico pdb p, assim:
(Pdb) p a 3 (Pdb_ p i 1
Executando a próxima linha
E daí se quisermos executar a próxima linha de código? Existem duas opções:
- Com
s
oustep
, você executa a linha atual. O depurador para na primeira ocasião possível depois disso. - Com
n
ounext
, você executa a linha atual também, mas agora o depurador continua até que a próxima linha da função atual seja alcançada.
Para deixar isso mais claro:
step
felizmente entra em uma chamada de função e quebra dentro dessa função. Por outro lado, next
executa a função até que ela retorne e quebra na próxima linha. Outros depuradores e IDEs também chamam isso de 'step into' (em vez de step) e 'step over' (em vez de next).
Agora vamos usar esses dois:
$ python3 breakpointing.py -> print(a) (Pdb) s 3 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) n -> breakpoint() (Pdb) n -> print(a) (Pdb) n 4 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) s --Call-- -> def add_two(x): (Pdb) s -> return x + 2 (Pdb) s --Return-- 5 -> return x + 2 (Pdb) s -> breakpoint() (Pdb)
Como você pode ver, primeiro passamos pela chamada para
add_two
com n
. Na segunda vez, entramos na função com s
. Comandos do depurador Python
Existem mais comandos que você pode tentar por conta própria. Não vou listar todos, apenas os mais úteis:
h
(ajuda):imprime todos os comandos disponíveis. Também recebe um argumento, por exemploh c
informa o que oc
comando fazc
(continuar):comece a executar até o próximo ponto de interrupçãol
(list):lista o código fonte ao redor da linha atualp
:imprime o resultado da seguinte expressão. Você pode usar isso em vez de chamarprint()
pp
:pretty print, útil para imprimir estruturas de dados como dicionários- reiniciar:reiniciar o programa atual
Para obter a documentação completa, vá para a página do depurador Python, onde todos os comandos estão listados.
Continue aprendendo
Embora isso possa ser super útil, vale a pena mergulhar no depurador que seu IDE oferece. Se você é um usuário do VSCode, escrevi um tutorial sobre como depurar código Python no VSCode.

python
- Entrada, Saída e Importação do Python
- Instrução Python Print():Como imprimir com exemplos
- Strings Python:Substituir, Unir, Dividir, Reverter, Maiúsculas e Minúsculas
- Python time.sleep():adicionar atraso ao seu código (exemplo)
- Python New Line:Como imprimir SEM Newline em Python
- Frotas conectadas melhoram seus resultados
- Como os protótipos melhoram seu processo de fabricação
- 5 maneiras de melhorar suas peças de chapa metálica
- 3 dicas para melhorar seu plano de manutenção de equipamentos
- Dicas e considerações:aprenda a melhorar suas habilidades de design de PCB