PySnooper es un depurador de pobres. Si has usado Bash, es como set -x
para Python, excepto que es más sofisticado.
Tu historia: estás intentando descubrir por qué tu código Python no hace lo que crees que debería hacer. Le encantaría utilizar un depurador completo con puntos de interrupción y vigilancias, pero no puede molestarse en configurar uno en este momento.
Quiere saber qué líneas se están ejecutando y cuáles no, y cuáles son los valores de las variables locales.
La mayoría de la gente usaría líneas print
, en ubicaciones estratégicas, algunas de ellas mostrando los valores de las variables.
PySnooper te permite hacer lo mismo, excepto que en lugar de crear cuidadosamente las líneas print
correctas, simplemente agregas una línea decoradora a la función que te interesa. Obtendrás un registro jugada por jugada de tu función, incluidas las líneas. se ejecutó y cuándo, y exactamente cuándo se cambiaron las variables locales.
¿Qué diferencia a PySnooper de todas las demás herramientas de inteligencia de código? Puede usarlo en su base de código empresarial en expansión y de mierda sin tener que realizar ninguna configuración. Simplemente active el decorador, como se muestra a continuación, y redirija la salida a un archivo de registro dedicado especificando su ruta como primer argumento.
Estamos escribiendo una función que convierte un número a binario devolviendo una lista de bits. Espiémoslo agregando el 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 )
La salida a stderr es:
O si no desea rastrear una función completa, puede envolver la parte relevante en un bloque 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 genera 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
Si no puede acceder fácilmente a stderr, puede redirigir la salida a un archivo:
@ pysnooper . snoop ( '/my/log/file.log' )
También puedes pasar una secuencia o un invocable y se usarán.
Vea valores de algunas expresiones que no son variables locales:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
Muestre líneas de snoop para las funciones que llama su función:
@ pysnooper . snoop ( depth = 2 )
Consulte Uso avanzado para obtener más opciones. <------
La mejor forma de instalar PySnooper es con Pip:
$ pip install pysnooper
Conda con canal conda-forge:
$ conda install -c conda-forge pysnooper
Arco Linux:
$ yay -S python-pysnooper
FedoraLinux:
$ dnf install python3-pysnooper
Si utiliza PySnooper en trabajos académicos, utilice este formato de cita:
@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 y colaboradores, publicado bajo la licencia MIT.
Hilo de Hacker News y hilo de /r/Python Reddit (22 de abril de 2019)