PySnooper เป็นดีบักเกอร์ของคนจน หากคุณเคยใช้ Bash มันจะเหมือนกับ set -x
สำหรับ Python ยกเว้นว่ามันจะดูดีกว่า
เรื่องราวของคุณ: คุณกำลังพยายามหาคำตอบว่าทำไมโค้ด Python ของคุณจึงไม่ทำในสิ่งที่คุณคิดว่ามันควรจะทำ คุณคงชอบที่จะใช้ดีบักเกอร์ที่มีคุณสมบัติครบถ้วนพร้อมเบรกพอยต์และนาฬิกา แต่ตอนนี้คุณไม่ต้องกังวลใจที่จะตั้งค่าในตอนนี้
คุณต้องการทราบว่าบรรทัดใดกำลังทำงานอยู่ และบรรทัดใดไม่ทำงาน และค่าของตัวแปรภายในเครื่องคือเท่าใด
คนส่วนใหญ่จะใช้เส้น print
ในตำแหน่งเชิงกลยุทธ์ ซึ่งบางส่วนจะแสดงค่าของตัวแปร
PySnooper ให้คุณทำเช่นเดียวกัน ยกเว้นแทนที่จะสร้างบรรทัด print
ที่ถูกต้องอย่างระมัดระวัง คุณเพียงเพิ่มบรรทัดมัณฑนากรหนึ่งบรรทัดให้กับฟังก์ชันที่คุณสนใจ คุณจะได้รับบันทึกการเล่นทีละเล่นของฟังก์ชันของคุณ รวมถึงบรรทัดใดบ้าง วิ่งและเมื่อใด และเมื่อใดที่ตัวแปรในเครื่องมีการเปลี่ยนแปลง
อะไรทำให้ PySnooper โดดเด่นจากเครื่องมือโค้ดอัจฉริยะอื่นๆ ทั้งหมด คุณสามารถใช้มันในโค้ดเบสองค์กรที่ห่วยและกว้างขวางได้โดยไม่ต้องตั้งค่าใดๆ เพียงตบมัณฑนากรดังที่แสดงด้านล่าง และเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์บันทึกเฉพาะโดยการระบุเส้นทางเป็นอาร์กิวเมนต์แรก
เรากำลังเขียนฟังก์ชันที่แปลงตัวเลขเป็นไบนารี่โดยส่งคืนรายการบิต มาสอดแนมมันด้วยการเพิ่ม @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 )
ผลลัพธ์ไปยัง stderr คือ:
หรือหากคุณไม่ต้องการติดตามฟังก์ชันทั้งหมด คุณสามารถล้อมส่วนที่เกี่ยวข้องไว้ในบล็อก 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 ()
ซึ่งให้ผลลัพธ์ดังนี้:
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
หากคุณไม่สามารถเข้าถึง stderr ได้อย่างง่ายดาย คุณสามารถเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ได้:
@ pysnooper . snoop ( '/my/log/file.log' )
คุณยังสามารถส่งกระแสข้อมูลหรือสายเรียกเข้าแทนได้ และพวกเขาจะถูกนำมาใช้
ดูค่าของนิพจน์บางตัวที่ไม่ใช่ตัวแปรในเครื่อง:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
แสดงบรรทัดสนูปสำหรับฟังก์ชันที่ฟังก์ชันของคุณเรียกใช้:
@ pysnooper . snoop ( depth = 2 )
ดูการใช้งานขั้นสูงสำหรับตัวเลือกเพิ่มเติม -
วิธีที่ดีที่สุดในการติดตั้ง PySnooper คือการใช้ Pip:
$ pip install pysnooper
Conda พร้อมช่อง conda-forge:
$ conda install -c conda-forge pysnooper
อาร์คลินุกซ์:
$ yay -S python-pysnooper
เฟโดรา ลินุกซ์:
$ dnf install python3-pysnooper
หากคุณใช้ PySnooper ในงานวิชาการ โปรดใช้รูปแบบการอ้างอิงนี้:
@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 }
}
ลิขสิทธิ์ (c) 2019 Ram Rachum และผู้ทำงานร่วมกัน เผยแพร่ภายใต้ใบอนุญาต MIT
กระทู้ Hacker News และ /r/Python Reddit กระทู้ (22 เมษายน 2019)