PySnooper é um depurador de pobre. Se você usou Bash, é como set -x
para Python, exceto que é mais sofisticado.
Sua história: você está tentando descobrir por que seu código Python não está fazendo o que você acha que deveria estar fazendo. Você adoraria usar um depurador completo com pontos de interrupção e relógios, mas não pode se preocupar em configurar um agora.
Você quer saber quais linhas estão em execução e quais não estão, e quais são os valores das variáveis locais.
A maioria das pessoas usaria linhas print
, em locais estratégicos, algumas delas mostrando os valores das variáveis.
PySnooper permite que você faça o mesmo, exceto que, em vez de criar cuidadosamente as linhas print
corretas, basta adicionar uma linha de decorador à função na qual está interessado. correu e quando e exatamente quando as variáveis locais foram alteradas.
O que faz o PySnooper se destacar de todas as outras ferramentas de inteligência de código? Você pode usá-lo em sua extensa base de código empresarial sem precisar fazer nenhuma configuração. Basta ativar o decorador, conforme mostrado abaixo, e redirecionar a saída para um arquivo de log dedicado, especificando seu caminho como o primeiro argumento.
Estamos escrevendo uma função que converte um número em binário, retornando uma lista de bits. Vamos bisbilhotar adicionando o decorador @pysnooper.snoop()
:
import pysnooper
@ pysnooper . snoop ()
def number_to_bits ( number ):
if number :
bits = []
while number :
number , remainder = divmod ( number , 2 )
bits . insert ( 0 , remainder )
return bits
else :
return [ 0 ]
number_to_bits ( 6 )
A saída para stderr é:
Ou se não quiser rastrear uma função inteira, você pode agrupar a parte relevante em um bloco with
:
import pysnooper
import random
def foo ():
lst = []
for i in range ( 10 ):
lst . append ( random . randrange ( 1 , 1000 ))
with pysnooper . snoop ():
lower = min ( lst )
upper = max ( lst )
mid = ( lower + upper ) / 2
print ( lower , mid , upper )
foo ()
que gera algo como:
New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line 10 lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line 11 upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12 mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13 print(lower, mid, upper)
Elapsed time: 00:00:00.000344
Se stderr não estiver facilmente acessível para você, você pode redirecionar a saída para um arquivo:
@ pysnooper . snoop ( '/my/log/file.log' )
Você também pode passar um stream ou um callable e eles serão usados.
Veja valores de algumas expressões que não são variáveis locais:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
Mostre linhas de espionagem para funções que sua função chama:
@ pysnooper . snoop ( depth = 2 )
Consulte Uso avançado para obter mais opções. <------
A melhor maneira de instalar o PySnooper é com Pip:
$ pip install pysnooper
Conda com canal conda-forge:
$ conda install -c conda-forge pysnooper
Arco Linux:
$ yay -S python-pysnooper
FedoraLinux:
$ dnf install python3-pysnooper
Se você usa PySnooper em trabalhos acadêmicos, use este formato de citação:
@software { rachum2019pysnooper ,
title = { PySnooper: Never use print for debugging again } ,
author = { Rachum, Ram and Hall, Alex and Yanokura, Iori and others } ,
year = { 2019 } ,
month = { jun } ,
publisher = { PyCon Israel } ,
doi = { 10.5281/zenodo.10462459 } ,
url = { https://github.com/cool-RR/PySnooper }
}
Copyright (c) 2019 Ram Rachum e colaboradores, lançado sob a licença do MIT.
Tópico Hacker News e tópico /r/Python Reddit (22 de abril de 2019)