PySnooper est un débogueur pour les pauvres. Si vous avez utilisé Bash, c'est comme set -x
pour Python, sauf que c'est plus sophistiqué.
Votre histoire : vous essayez de comprendre pourquoi votre code Python ne fait pas ce que vous pensez qu'il devrait faire. Vous aimeriez utiliser un débogueur à part entière avec des points d'arrêt et des surveillances, mais vous ne pouvez pas vous donner la peine d'en configurer un pour le moment.
Vous voulez savoir quelles lignes sont en cours d'exécution et lesquelles ne le sont pas, et quelles sont les valeurs des variables locales.
La plupart des gens utiliseraient des lignes print
, à des endroits stratégiques, certaines montrant les valeurs des variables.
PySnooper vous permet de faire la même chose, sauf qu'au lieu de créer soigneusement les bonnes lignes print
, vous ajoutez simplement une ligne de décorateur à la fonction qui vous intéresse. Vous obtiendrez un journal play-by-play de votre fonction, y compris les lignes exécuté et quand, et exactement quand les variables locales ont été modifiées.
Qu'est-ce qui distingue PySnooper de tous les autres outils d'intelligence de code ? Vous pouvez l'utiliser dans votre base de code d'entreprise merdique et tentaculaire sans avoir à effectuer de configuration. Activez simplement le décorateur, comme indiqué ci-dessous, et redirigez la sortie vers un fichier journal dédié en spécifiant son chemin comme premier argument.
Nous écrivons une fonction qui convertit un nombre en binaire, en renvoyant une liste de bits. Fouinons-le en ajoutant le décorateur @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 sortie vers stderr est :
Ou si vous ne souhaitez pas tracer une fonction entière, vous pouvez envelopper la partie concernée dans un bloc 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 ()
qui produit quelque chose comme :
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 stderr n'est pas facilement accessible pour vous, vous pouvez rediriger la sortie vers un fichier :
@ pysnooper . snoop ( '/my/log/file.log' )
Vous pouvez également transmettre un flux ou un appelable à la place, et ils seront utilisés.
Consultez les valeurs de certaines expressions qui ne sont pas des variables locales :
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
Afficher les lignes de surveillance pour les fonctions que votre fonction appelle :
@ pysnooper . snoop ( depth = 2 )
Voir Utilisation avancée pour plus d'options. <------
La meilleure façon d’installer PySnooper est d’utiliser Pip :
$ pip install pysnooper
Conda avec le canal conda-forge :
$ conda install -c conda-forge pysnooper
Arch Linux :
$ yay -S python-pysnooper
Fedora Linux :
$ dnf install python3-pysnooper
Si vous utilisez PySnooper dans le cadre de travaux universitaires, veuillez utiliser ce format de citation :
@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 et collaborateurs, publié sous licence MIT.
Fil de discussion Hacker News et fil de discussion /r/Python Reddit (22 avril 2019)