PySnooper ist ein Debugger für arme Leute. Wenn Sie Bash verwendet haben, ist es wie set -x
für Python, nur dass es schicker ist.
Ihre Geschichte: Sie versuchen herauszufinden, warum Ihr Python-Code nicht das tut, was er Ihrer Meinung nach tun sollte. Sie würden gerne einen vollwertigen Debugger mit Haltepunkten und Überwachungen verwenden, können sich aber jetzt nicht die Mühe machen, einen einzurichten.
Sie möchten wissen, welche Zeilen ausgeführt werden und welche nicht und welche Werte die lokalen Variablen haben.
Die meisten Leute würden an strategischen Stellen print
verwenden, von denen einige die Werte von Variablen anzeigen.
Mit PySnooper können Sie das Gleiche tun, außer dass Sie nicht sorgfältig die richtigen print
erstellen müssen, sondern nur eine Dekoratorzeile zu der Funktion hinzufügen, an der Sie interessiert sind. Sie erhalten ein Play-by-Play-Protokoll Ihrer Funktion, einschließlich der Zeilen lief und wann und genau wann lokale Variablen geändert wurden.
Was unterscheidet PySnooper von allen anderen Code-Intelligence-Tools? Sie können es in Ihrer beschissenen, weitläufigen Unternehmenscodebasis verwenden, ohne dass Sie irgendwelche Einstellungen vornehmen müssen. Setzen Sie einfach den Dekorator ein, wie unten gezeigt, und leiten Sie die Ausgabe in eine dedizierte Protokolldatei um, indem Sie deren Pfad als erstes Argument angeben.
Wir schreiben eine Funktion, die eine Zahl in eine Binärzahl umwandelt, indem sie eine Liste von Bits zurückgibt. Lassen Sie uns der Sache auf den Grund gehen, indem wir den Dekorator @pysnooper.snoop()
hinzufügen:
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 )
Die Ausgabe an stderr ist:
Wenn Sie nicht eine gesamte Funktion verfolgen möchten, können Sie den relevanten Teil in einen with
Block einschließen:
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 ()
was etwa Folgendes ausgibt:
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
Wenn stderr für Sie nicht leicht zugänglich ist, können Sie die Ausgabe in eine Datei umleiten:
@ pysnooper . snoop ( '/my/log/file.log' )
Sie können stattdessen auch einen Stream oder ein Callable übergeben, und diese werden verwendet.
Sehen Sie sich die Werte einiger Ausdrücke an, die keine lokalen Variablen sind:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
Snoop-Leitungen für Funktionen anzeigen, die Ihre Funktion aufruft:
@ pysnooper . snoop ( depth = 2 )
Weitere Optionen finden Sie unter Erweiterte Nutzung. <------
Der beste Weg, PySnooper zu installieren, ist mit Pip:
$ pip install pysnooper
Conda mit Conda-Forge-Kanal:
$ conda install -c conda-forge pysnooper
Arch Linux:
$ yay -S python-pysnooper
Fedora-Linux:
$ dnf install python3-pysnooper
Wenn Sie PySnooper in wissenschaftlichen Arbeiten verwenden, verwenden Sie bitte dieses Zitierformat:
@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 und Mitarbeiter, veröffentlicht unter der MIT-Lizenz.
Hacker News-Thread und /r/Python Reddit-Thread (22. April 2019)