ฉันจะขยายคำตอบจาก @RayLuo
ปัญหาของ LBYL คือ จริงๆ แล้วมันไม่ได้ผลโดยทั่วไป เว้นแต่ว่าคุณมีแอปพลิเคชันแบบเธรดเดียว ก็จะมีสภาวะการแข่งขันที่เป็นไปได้เสมอ:
# LBYL
if key in dic:
# RACE CONDITION
print(dic[key])
else:
handleError()
# EAFP
try:
print(dic[key])
except KeyError:
handleError()
คุณสามารถเพิ่มคีย์ลงใน dict ระหว่างการตรวจสอบ if
และ และ print
นั่นฟังดูไม่น่าจะเป็นไปได้อย่างไม่น่าเชื่อในกรณีนี้โดยเฉพาะ อย่างไรก็ตาม มีความเป็นไปได้มากกว่ามากหากการตรวจสอบที่คุณทำนั้นขัดแย้งกับ DB, API หรือแหล่งข้อมูลภายนอกใดๆ ที่สามารถเปลี่ยนแปลงแบบอะซิงโครนัสกับข้อมูลแอปพลิเคชันของคุณ
นั่นหมายถึงวิธีที่ถูกต้องในการใช้ LBYL คือ:
if key in dic:
try:
print(dic[key])
except KeyError:
handleError()
else:
handleError()
โปรดทราบว่าส่วนคำสั่ง try
/ except
นั้นเหมือนกับวิธี EAFP ทุกประการ
เนื่องจากคุณต้องจัดการข้อยกเว้นในลักษณะ EAFP แม้ว่าจะใช้วิธีการ LBYL คุณจึงอาจใช้แนวทาง EAFP ในตอนแรกได้เช่นกัน
สถานการณ์เดียวที่ฉันจะใช้การตรวจสอบ if
คือการดำเนินการที่ตามมา (print
ในกรณีนี้) มีราคาแพงมาก/ใช้เวลานานในการเริ่มต้นหรือไม่ นั่นอาจเกิดขึ้นได้ยากและไม่ใช่เหตุผลที่ต้องใช้การตรวจสอบ if
ทุกครั้ง
บรรทัดล่าง: LBYL ไม่ทำงานในกรณีทั่วไป แต่ EAFP ใช้งานได้ นักพัฒนาที่ดีมุ่งเน้นไปที่รูปแบบการแก้ปัญหาทั่วไปที่พวกเขาสามารถใช้ได้อย่างมั่นใจกับปัญหาต่างๆ มากมาย เรียนรู้การใช้ EAFP อย่างสม่ำเสมอ
person
Chris Johnson
schedule
01.03.2021
try...except
? ฉันควรเปลี่ยนคำถามไหม? - person n1000   schedule 02.10.2015assert
แล้ว เห็นได้ชัดว่าฉันไม่ได้ใช้สิ่งเหล่านั้นอย่างถูกต้องในอดีต ... - person n1000   schedule 02.10.2015