python pdb - ข้ามลูป


88

ฉันจะข้ามการวนซ้ำโดยใช้pdb.set_trace()?

ตัวอย่างเช่น,

pdb.set_trace()
for i in range(5):
     print(i)

print('Done!')

pdbแจ้งก่อนลูป ฉันป้อนคำสั่ง ค่า 1-5 ทั้งหมดจะถูกส่งกลับจากนั้นฉันต้องการได้รับแจ้งpdbอีกครั้งก่อนprint('Done!')ดำเนินการ

คำตอบ:


137

ลองใช้untilคำสั่ง

ไปที่บรรทัดสุดท้ายของวง (มีnextหรือn) และจากนั้นใช้หรือuntil untสิ่งนี้จะนำคุณไปยังบรรทัดถัดไปหลังจากวนซ้ำ

http://www.doughellmann.com/PyMOTW/pdb/มีคำอธิบายที่ดี


บทความจาก: ไปที่บรรทัดสุดท้ายของการห่วงโดยใช้และจากนั้นพิมพ์n untilสิ่งนี้จะดำเนินไปจนกว่าจะเกินบรรทัดปัจจุบันเป็นอย่างน้อย
sachinruk

ทำงานร่วมกับความเข้าใจในรายการด้วย คุณไม่ต้องสนใจบรรทัดสุดท้าย
พระอิศวร

คุณจะทำอย่างไรถ้าไปที่บรรทัดสุดท้ายของลูปนั้นยุ่งยาก ไม่มีฟังก์ชันที่เทียบเท่ากับการfใช้งานของ R debugซึ่ง "เสร็จสิ้นการดำเนินการของลูปปัจจุบันหรือฟังก์ชัน" ( adv-r.hadley.nz/debugging.html ) หรือไม่
Qaswed

การใช้until(หรือรูปแบบสั้นunt) โดยไม่ขัดแย้งมักจะลงไปบรรทัด (ยกเว้นกรณีที่คุณกดคำสั่งกลับ) nดังนั้นคุณยังสามารถใช้มันพวงของครั้งแทน
Boris

มันไม่ได้ทำงานกับชุดในวงในbreakpoint() สามารถยอมรับจุดพัก 'ได้ทันที' แต่นี้เป็นส่วนใหญ่มีแนวโน้มไม่ใช่กรณีที่มี python 3VB Editorpdb
Timo

4

คุณควรตั้งเบรกพอยต์หลังลูป ("break main.py:4" โดยสันนิษฐานว่าบรรทัดด้านบนอยู่ในไฟล์ชื่อ main.py) แล้วดำเนินการต่อ ("c")


2

ในลิงค์ที่กล่าวถึงโดยคำตอบที่ยอมรับ ( https://pymotw.com/3/pdb/ ) ฉันพบว่าส่วนนี้ค่อนข้างมีประโยชน์มากกว่า:

หากต้องการให้การดำเนินการทำงานจนถึงบรรทัดที่ระบุให้ส่งหมายเลขบรรทัดไปยังคำสั่ง until

นี่คือตัวอย่างของวิธีการทำงาน re: ลูป:

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่

มันช่วยคุณได้สองสิ่ง: ต้องสร้างเบรกพอยต์เพิ่มเติมและต้องไปที่จุดสิ้นสุดของลูป (โดยเฉพาะอย่างยิ่งเมื่อคุณอาจทำซ้ำไปแล้วซึ่งคุณจะไม่สามารถทำได้หากไม่เรียกใช้ดีบักเกอร์ซ้ำ)

untilนี่คือเอกสารหลามบน Btw ฉันใช้pdb++เป็นดรอปอินสำหรับดีบักเกอร์มาตรฐาน (ดังนั้นการจัดรูปแบบ) แต่untilทำงานเหมือนกันทั้งสองอย่าง


0

คุณสามารถตั้งค่าเบรกพอยต์อื่นหลังจากลูปและข้ามไปที่จุดนั้น (เมื่อทำการดีบั๊ก) ด้วยc:

pdb.set_trace()
for i in range(5):
    print(i)

pdb.set_trace()
print('Done!')

-17

ถ้าเข้าใจถูกต้อง

วิธีหนึ่งที่เป็นไปได้ในการดำเนินการนี้คือ:

เมื่อคุณได้รับpdbแจ้ง เพียงกดn(ถัดไป) 10 ครั้งเพื่อออกจากลูป

pdbแต่ผมไม่ทราบวิธีที่จะออกจากวงใน

คุณสามารถใช้rเพื่อออกจากฟังก์ชันได้


5
แล้วถ้าลูป 10000000 ล่ะ? คำตอบของคุณชัดเจนมาก
hecvd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.