Deseja se tornar um mestre na arte da depuração em Python? Prepare-se para explorar ferramentas e bibliotecas de depuração que vão transformar sua experiência de programação!
Python é uma linguagem de programação versátil, de alto nível e orientada a objetos, amplamente utilizada em diversas áreas do desenvolvimento. Sua eficácia se estende desde a criação de aplicações web até a raspagem de dados e aplicações complexas como aprendizado de máquina e ciência de dados.
Durante o processo de desenvolvimento, é comum que erros, conhecidos como “bugs”, surjam. Para lidar com esses problemas, os desenvolvedores realizam uma série de etapas para identificar e eliminar bugs, tanto os já existentes quanto os potenciais, evitando que o programa apresente falhas. Esse processo é o que chamamos de depuração.
Neste artigo, vamos explorar diversas ferramentas de depuração Python que você pode usar. Veremos como elas se diferenciam e o que as torna eficazes em suas aplicações.
Biblioteca de Depuração cProfile
O cProfile é uma biblioteca popular, uma extensão C que realiza o perfilamento de código em longo prazo. Ele é útil para identificar trechos do programa que levam muito tempo para serem executados. Embora determine o tempo necessário para a execução de diferentes partes do código, ele não identifica ou corrige os bugs por completo.
Por isso, é necessário usar outros depuradores.
Felizmente, existem bibliotecas como ipdb, Django-debug-toolbar, pyelftools, viztracer e py-spy que podem ser utilizadas como ferramentas complementares para depurar seu código Python.
A Ferramenta de Depuração ipdb
O depurador Python com suporte ao IPython, conhecido como ipdb, é uma ferramenta interativa de terceiros que incorpora a funcionalidade do pdb. O ipdb oferece suporte ao shell interativo do IPython, incluindo preenchimento por tabulação, cores e funções mágicas, entre outros recursos.
Este depurador permite acesso ao depurador do IPython ao exportar funções relevantes, oferecendo uma interface similar para melhor introspecção, semelhante ao módulo pdb.
Depurando com ipdb
A biblioteca requer instalação via pip, usando o seguinte comando:
pip install ipdb
Um exemplo de uso do ipdb seria assim:
import ipdb alpha_list = ['a', 'b', 'c'] fruit_list = ['orange', 'mango', 'kiwi'] def nested_loop(): for fruit in fruit_list: print (fruit) ipdb.set_trace() for x in alpha_list: print(x) if __name__ == '__main__': nested_loop()
Execute o arquivo Python com o seguinte comando, onde “test.py” é o nome do arquivo:
python -m ipdb test.py
A importação do ipdb e a chamada da função `ipdb.set_trace()` iniciam o depurador durante a execução do programa.
A função `ipdb.pm()` (post-mortem) funciona de forma similar à função mágica `%debug`.
Argumentos de set_trace
Você pode passar um contexto como argumento para `set_trace` para exibir várias linhas de código definidas. Além disso, o argumento `cond`, também aceito por `set_trace`, recebe valores booleanos e ativa a interface do ipdb quando definido como `True`.
Usando o Arquivo de Configuração
O argumento `context` pode ser definido usando um arquivo `idpdb` ou um arquivo `setup.cfg`, localizados na pasta inicial ou na pasta do projeto, respectivamente. Para explorar mais funcionalidades do ipdb, você pode consultar a documentação.
Barra de Ferramentas de Depuração do Django
A Barra de Ferramentas de Depuração do Django é uma ferramenta de depuração popular no Django, um framework Python.
Este conjunto configurável de painéis exibe informações de depuração sobre a requisição ou resposta atual. Ao clicar na barra de ferramentas, mais detalhes sobre o conteúdo de cada painel são exibidos.
Esta ferramenta realiza uma inspeção completa do ambiente de desenvolvimento Django.
Siga o processo de instalação e as instruções de configuração aqui.
Biblioteca Pyelftools
A biblioteca pyelftools é totalmente construída em Python. Ela analisa arquivos ELF e informações de depuração DWARF, exigindo apenas Python para ser executada.
O uso do Pyelftools é simples, pois não possui dependências externas. Além disso, utilizá-lo sem instalação é fácil, bastando ajustar a variável `PYTHONPATH` nas variáveis de ambiente.
Você pode instalar usando:
pip install pyelftools
A implementação do pyelftools requer apenas importá-lo e invocá-lo em seu programa.
A Ferramenta de Depuração IceCream 🍦
Esta é mais uma ferramenta eficiente para desenvolvedores Python.
Usando o icecream, ou ic(), você obtém diversas vantagens em relação ao `print()`, conforme descrito abaixo:
- É mais rápido de digitar.
- Imprime estruturas de dados de forma mais organizada.
- Exibe expressões ou nomes de variáveis e seus valores com `ic()`.
- Realça a sintaxe da saída.
- Opcionalmente inclui contexto do programa, como o nome do arquivo, número da linha e função pai.
Antes de usar o pacote, instale-o com o comando pip:
pip install icecream
Você pode usar `ic()` em todos os seus arquivos sem precisar importá-lo em cada um, instalando com `install()`. Essa função adiciona `ic()` ao módulo interno, fazendo com que todos os arquivos importados pelo interpretador compartilhem a função.
No seu primeiro arquivo Python principal, que você pode nomear “x.py”, adicione `ic()` usando `install()`:
from icecream import install install() from y import mult mult()
No arquivo “y.py”, que o arquivo “x.py” importa, chame `ic()`:
def mult(): z=8 ic(z)
Resultado:
y ic| z : 8
O que torna `ic()` tão eficiente é sua capacidade de inspecionar as variáveis que são passadas a ele, inclusive ele mesmo, imprimindo os argumentos e seus valores, como no exemplo abaixo:
from icecream import ic def mult(x): return x * 4 ic(mult(100))
Resultado:
ic| mult(100): 400
Além disso, você pode inserir `ic()` em código pré-existente, já que ele retorna os próprios argumentos. No exemplo abaixo, ele retorna `ic| x: 12` e depois `ic| y: 48`.
from icecream import ic x = 12 def mult(x): return x*4 y = mult(ic(x)) ic(y)
Depurando com a Ferramenta py-spy
Você pode usar o py-spy para gerar perfis de amostra de seus programas Python como uma ferramenta de depuração. Sem a necessidade de reiniciar o programa ou modificar seu código, o py-spy visualiza a execução do seu programa Python. Ele também tem um baixo overhead por ser escrito em Rust.
Vale ressaltar que o uso do py-spy em código Python de produção é seguro, pois ele executa um processo diferente do programa que está sendo analisado.
Assim como as ferramentas anteriores, você pode utilizar o py-spy após sua instalação:
pip install py-spy
Mesmo que seu programa Python esteja lidando com tráfego de produção, você ainda pode perfilar e depurar o programa usando o py-spy, o que faz dele uma ferramenta essencial para perfilar Python.
Depurador Viztracer
Você também pode usar o Viztracer, uma ferramenta de depuração para rastrear e visualizar a execução do seu programa Python. Ele também serve como ferramenta de perfilagem com baixo overhead de registro.
O que torna o viztracer uma ferramenta de depuração tão eficaz?
- É fácil de usar e não depende de pacotes externos.
- O Viztracer opera em todas as plataformas: Windows, Linux ou macOS.
- Seu poderoso front-end renderiza rastreamentos de até GBs sem problemas.
- Utiliza RegEx para registrar funções arbitrárias e informações extras, como variáveis e atributos, exceções lançadas e operações do coletor de lixo, sem necessidade de modificar nenhuma parte do código-fonte.
- Uma das razões do baixo overhead do Viztracer é sua capacidade de filtrar os dados que você não precisa no programa, retendo informações relevantes antes de salvar o log no formato JSON.
- Você pode usá-lo para inserir eventos customizados como eventos instantâneos, eventos de variáveis, e eventos de duração conforme o programa é executado. Ele funciona como um depurador de impressão, mas o Viztracer mostra quando a impressão ocorre enquanto os dados são rastreados.
Conclusão
A criação de perfis e depuração em Python, assim como em software no geral, é uma etapa crucial no processo de desenvolvimento, que exige atenção. Essa etapa ajuda a descartar trechos de código problemáticos, otimizando o desempenho geral do código.
As ferramentas de depuração que abordamos são eficientes e facilitam significativamente o trabalho de um desenvolvedor Python.
Considerando que essas ferramentas funcionam de forma mais eficaz que o cProfiler, você pode, como um verdadeiro herói, depurar seu código Python e corrigir bugs em potencial, evitando que seu código execute com falhas.
Boa depuração!