PySnooper adalah debugger orang malang. Jika Anda pernah menggunakan Bash, ini seperti set -x
untuk Python, hanya saja lebih bagus.
Kisah Anda: Anda mencoba mencari tahu mengapa kode Python Anda tidak melakukan apa yang menurut Anda seharusnya dilakukan. Anda ingin menggunakan debugger lengkap dengan breakpoint dan jam tangan, tetapi Anda tidak perlu repot menyiapkannya sekarang.
Anda ingin mengetahui baris mana yang berjalan dan mana yang tidak, dan berapa nilai variabel lokalnya.
Kebanyakan orang akan menggunakan garis print
, di lokasi strategis, beberapa di antaranya menunjukkan nilai variabel.
PySnooper memungkinkan Anda melakukan hal yang sama, kecuali alih-alih membuat garis print
yang tepat dengan hati-hati, Anda cukup menambahkan satu garis dekorator ke fungsi yang Anda minati. Anda akan mendapatkan log fungsi Anda demi permainan, termasuk baris mana dijalankan dan kapan, dan kapan tepatnya variabel lokal diubah.
Apa yang membuat PySnooper menonjol dari semua alat intelijen kode lainnya? Anda dapat menggunakannya dalam basis kode perusahaan yang buruk dan luas tanpa harus melakukan pengaturan apa pun. Cukup aktifkan dekorator, seperti yang ditunjukkan di bawah ini, dan arahkan output ke file log khusus dengan menentukan jalurnya sebagai argumen pertama.
Kami sedang menulis fungsi yang mengubah angka menjadi biner, dengan mengembalikan daftar bit. Mari kita intip dengan menambahkan dekorator @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 )
Output dari stderr adalah:
Atau jika Anda tidak ingin melacak seluruh fungsi, Anda dapat menggabungkan bagian yang relevan dalam blok 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 ()
yang menghasilkan sesuatu seperti:
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
Jika stderr tidak mudah diakses oleh Anda, Anda dapat mengarahkan output ke file:
@ pysnooper . snoop ( '/my/log/file.log' )
Anda juga dapat meneruskan aliran atau callable, dan keduanya akan digunakan.
Lihat nilai beberapa ekspresi yang bukan variabel lokal:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
Tampilkan baris pengintai untuk fungsi yang dipanggil oleh fungsi Anda:
@ pysnooper . snoop ( depth = 2 )
Lihat Penggunaan Lanjutan untuk opsi lebih lanjut. <------
Cara terbaik untuk menginstal PySnooper adalah dengan Pip:
$ pip install pysnooper
Conda dengan saluran conda-forge:
$ conda install -c conda-forge pysnooper
Lengkungan Linux:
$ yay -S python-pysnooper
Fedora Linux:
$ dnf install python3-pysnooper
Jika Anda menggunakan PySnooper dalam tugas akademis, silakan gunakan format kutipan ini:
@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 }
}
Hak Cipta (c) 2019 Ram Rachum dan kolaborator, dirilis di bawah lisensi MIT.
Utas Berita Peretas dan utas /r/Python Reddit (22 April 2019)