ฉันจะจัดการตัวแปรที่ชื่อขัดแย้งกับคำสั่ง PDB ได้อย่างไร


95

รหัสของฉันดีขึ้นหรือแย่ลงเต็มไปด้วยตัวแปรตัวอักษรตัวเดียว (มันเป็นเรื่องของฟิสิกส์ดังนั้นตัวอักษรเหล่านั้นจึงมีความหมาย) เช่นเดียวกับ NumPy ที่ฉันมักจะโต้ตอบด้วย

nเมื่อใช้ดีบักหลามบางครั้งฉันจะต้องการดูที่มูลค่าของการพูด, อย่างไรก็ตามเมื่อฉันกดn<enter>นั่นคือคำสั่ง PDB (n)extซึ่งมีลำดับความสำคัญสูงกว่า print nมองไปรอบ ๆ แต่ฉันจะตั้งค่าได้อย่างไร


2
ประเภท overkill แต่คุณลองด้วยeval? eval('n = 3')เหรอ? อาจจะช่วยได้ :)
Paulo Bu

คำตอบ:


131

ใช้เครื่องหมายอัศเจรีย์!หน้าคำสั่งเพื่อให้มันทำงาน:

python -m pdb test.py
> /home/user/test.py(1)<module>()
-> print('foo')
(Pdb) !n = 77
(Pdb) !n
77
(Pdb) n
foo
> /home/user/test.py(2)<module>()
-> print('bar')
(Pdb)

เอกสารบอกว่า:

! statement

ดำเนินการ (หนึ่งบรรทัด) คำสั่งในบริบทของกองกรอบปัจจุบัน เครื่องหมายอัศเจรีย์สามารถละเว้นได้เว้นแต่คำแรกของคำสั่งจะคล้ายกับคำสั่งดีบักเกอร์ [... ]


1
IMO มันจะใช้งานง่ายกว่าสำหรับคำสั่งที่ต้องการ! หรือคำนำหน้าดังกล่าว
user76284

13

คุณสามารถใช้อัฒภาคได้ดังนั้นเพียงแค่ใส่อย่างอื่นไว้ข้างหน้า:

ipdb> print n
2
ipdb> n
> 145 <some code here>
  146
  147

ipdb> 1; n=4
1
ipdb> print n
4

7
วิธีแก้ปัญหาที่ใช้งานได้ แต่ฉันเชื่อว่า '!' เป็นผู้ดำเนินการที่ตั้งใจจะจัดการกับกรณีนี้
ไดโนเสาร์

2

นั่นไม่ใช่คำตอบโดยตรงสำหรับคำถามของคุณ แต่อาจช่วยคุณได้: PuDBเป็นอินเทอร์เฟซภาพบนคอนโซลสำหรับ PDB ซึ่งแยกคำสั่งออกจากการจัดการตัวแปรตามการออกแบบ


ดูน่าสนใจ; ฉันจะต้องแทงมันเมื่อฉันมีเวลาเรียนรู้
Nick T

-1

Eric IDE, Wing IDE และ Spyder ที่จะกล่าวถึงมีเพียงไม่กี่คนที่มีตัวดีบักภาพที่คุ้มค่ากับการไปเมื่อแยกการแสดงค่าออกจากคำสั่ง


ตัวดีบักภาพมักจะช้ามากเมื่อเทียบกับการดีบักผ่านคอนโซลซึ่งแทบจะใช้เวลาไม่นานในการเริ่มโปรแกรมดีบัก
อยากรู้อยากเห็น

1
@ อยากรู้อยากเห็นพวกเขาเริ่มช้าลง แต่มักจะใช้งานได้มากกว่าโดยเฉพาะสำหรับผู้ที่มีประสบการณ์ จำกัด
Steve Barnes

สำหรับงานทางวิทยาศาสตร์ฉันพบว่าดีบักเกอร์ของ Spyder มีประโยชน์ ฉันไม่คิดว่าการดีบักเมทริกซ์ 10x10 นั้นใช้ได้จริงใน CLI
shaunakde
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.