นี่เป็นคำถามที่น้อยกว่าเกี่ยวกับธรรมชาติของการพิมพ์เป็ด
ก่อนอื่น - เมื่อต้องรับมือกับ dicts โดยเฉพาะอย่างยิ่งเมื่อโครงสร้างของ dict นั้นสามารถคาดเดาได้อย่างเป็นธรรมและโดยทั่วไปแล้วคีย์ที่ได้รับจะไม่ปรากฏ แต่บางครั้งก็เป็นฉันแรกที่คิดว่าสองวิธี:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
และแน่นอนว่าแนวทางการให้อภัยกับการอนุญาตของ Ye Olde
try:
do_some_work(dict[myKey])
except KeyError:
pass
ในฐานะที่เป็นคนที่แต่งตัวประหลาดงูหลามชำนาญฉันรู้สึกเหมือนฉันเห็นหลังที่ต้องการเป็นจำนวนมากซึ่งจะให้ความรู้สึกที่ผมคิดว่าแปลกเพราะในเอกสารหลามtry/excepts
ดูเหมือนจะเป็นที่ต้องการเมื่อมีข้อผิดพลาดที่เกิดขึ้นจริงเมื่อเทียบกับเอ่อ ... ตัวตนของความสำเร็จ?
หาก dict เป็นครั้งคราวไม่มีคีย์ใน myDict และเป็นที่ทราบกันว่ามันจะไม่มีคีย์นั้นอยู่เสมอลอง / ยกเว้นในกรณีที่ทำให้เข้าใจผิดบริบทหรือไม่ นี่ไม่ใช่ข้อผิดพลาดในการเขียนโปรแกรมมันเป็นเพียงข้อมูลจริง - dict นี้ไม่มีรหัสเฉพาะนั้น
สิ่งนี้ดูเหมือนว่าสำคัญเป็นอย่างยิ่งเมื่อคุณดูที่ลอง / ยกเว้น / ไวยากรณ์อื่นซึ่งดูเหมือนจะมีประโยชน์จริง ๆ เมื่อตรวจสอบให้แน่ใจว่าการลองไม่จับข้อผิดพลาดมากเกินไป คุณสามารถทำสิ่งที่ชอบ:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
ไม่ว่าจะนำไปสู่การกลืนข้อผิดพลาดแปลก ๆ ทุกชนิดที่อาจเป็นผลมาจากรหัสที่ไม่ดี? โค้ดด้านบนอาจป้องกันคุณไม่ให้เห็นว่าคุณกำลังพยายามเพิ่ม2 + {}
และคุณอาจไม่เคยรู้เลยว่ารหัสบางส่วนของคุณผิดไปอย่างมาก ฉันไม่แนะนำให้เราตรวจสอบทุกประเภทนั่นคือสาเหตุที่เป็น Python ไม่ใช่ JavaScript - แต่ด้วยบริบทของการลอง / ยกเว้นอีกครั้งดูเหมือนว่าควรจะจับโปรแกรมที่ทำสิ่งที่ไม่ควรทำแทน ของการเปิดใช้งานเพื่อดำเนินการต่อ
ฉันรู้ว่าตัวอย่างข้างต้นเป็นสิ่งที่โต้แย้งว่าเป็นคนฟางและในความเป็นจริงแล้วเจตนาไม่ดี แต่ด้วยความเชื่อแบบ pythonic ของbetter to ask forgiveness than permission
ฉันอดไม่ได้ที่จะรู้สึกว่ามันเป็นคำถามที่ว่าเส้นในทรายเป็นจริงระหว่างการใช้งานที่ถูกต้องของ if / else กับ try / ยกเว้นคือโดยเฉพาะอย่างยิ่งเมื่อคุณรู้ว่าจะคาดหวังอะไร ข้อมูลที่คุณทำงานด้วย
ฉันไม่ได้พูดถึงความกังวลเรื่องความเร็วหรือการปฏิบัติที่ดีที่สุดที่นี่ฉันแค่สับสนอย่างเงียบ ๆ โดยแผนภาพ Venn ที่รับรู้ของคดีที่ดูเหมือนว่ามันจะไปทางใดทางหนึ่ง แต่คนทำผิดด้านลอง / ยกเว้น เพราะ 'ใครบางคนบอกว่ามันเป็น Pythonic' ฉันได้ข้อสรุปที่ผิดเกี่ยวกับการใช้ไวยากรณ์นี้หรือไม่?