"ใช้หลักการ EAFP" ใน Python หมายความว่าอย่างไร คุณช่วยยกตัวอย่างได้ไหม
"ใช้หลักการ EAFP" ใน Python หมายความว่าอย่างไร คุณช่วยยกตัวอย่างได้ไหม
คำตอบ:
จากอภิธานศัพท์ :
ขอการให้อภัยได้ง่ายกว่าการอนุญาต รูปแบบการเข้ารหัส Python ทั่วไปนี้ถือว่ามีคีย์หรือแอตทริบิวต์ที่ถูกต้องและตรวจจับข้อยกเว้นหากสมมติฐานพิสูจน์ว่าเป็นเท็จ สไตล์ที่สะอาดและรวดเร็วนี้โดดเด่นด้วยการมีอยู่มากมาย
try
และexcept
งบ เทคนิคนี้แตกต่างจากรูปแบบ LBYLทั่วไปกับภาษาอื่น ๆ เช่น C
ตัวอย่างเช่นการพยายามเข้าถึงคีย์พจนานุกรม
EAFP:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
ปอนด์:
if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
เวอร์ชัน LBYL ต้องค้นหาคีย์ภายในพจนานุกรมสองครั้งและอาจถือว่าอ่านได้น้อยกว่าเล็กน้อย
x
เมื่อไม่มีคีย์: x = mydict.get('key')
จะส่งคืนNone
หาก'key'
ไม่ได้อยู่ในmy_dict
; คุณสามารถทำได้.get('key', <something>)
จากนั้น x จะถูกกำหนดให้บางอย่างถ้าคีย์ไม่ได้อยู่ในพจนานุกรม dict.setdefault()
และcollections.defaultdict
เป็นสิ่งที่ดีสำหรับการหลีกเลี่ยงโค้ดส่วนเกินเช่นกัน
except KeyError
เช่นเดียวกับการAttributeError
ที่เรียบง่าย แต่บางตัวอย่างที่เลวร้ายที่สุด หลายครั้งที่ฉันติดอยู่ในการดีบักบางสิ่งบางอย่างเพราะexcept AttributeError
ใส่ผิดตำแหน่งซึ่งท้ายที่สุดแล้วการจับข้อผิดพลาดของแอตทริบิวต์ที่ไม่ถูกต้องทำให้ลึกลงไปในห่วงโซ่ ตัวอย่างที่ดีกว่าที่ฉันคิดคือ: try: open() ... except: IOError
. หรือtry: parseLine() ... except ParseError
ฉันจะพยายามอธิบายด้วยตัวอย่างอื่น
ที่นี่เรากำลังพยายามเข้าถึงไฟล์และพิมพ์เนื้อหาในคอนโซล
เราอาจต้องการตรวจสอบว่าสามารถเข้าถึงไฟล์ได้หรือไม่และหากทำได้เราจะเปิดและพิมพ์เนื้อหา หากเราไม่สามารถเข้าถึงไฟล์ได้เราจะเข้าสู่else
ส่วนนั้น สาเหตุที่เป็นเงื่อนไขการแข่งขันเนื่องจากเราทำการตรวจสอบการเข้าถึงก่อน เมื่อถึงเวลาที่เราไปถึงwith open(my_file) as f:
บางทีเราไม่สามารถเข้าถึงได้อีกต่อไปเนื่องจากปัญหาการอนุญาตบางอย่าง (เช่นกระบวนการอื่นจะได้รับการล็อกไฟล์เฉพาะ) รหัสนี้มีแนวโน้มที่จะเกิดข้อผิดพลาดและเราจะไม่สามารถจับข้อผิดพลาดนั้นได้เนื่องจากเราคิดว่าเราสามารถเข้าถึงไฟล์ได้
import os
my_file = "/path/to/my/file.txt"
# Race condition
if os.access(my_file, os.R_OK):
with open(my_file) as f:
print(f.read())
else:
print("File can't be accessed")
ในตัวอย่างนี้เราแค่พยายามเปิดไฟล์และถ้าเปิดไม่ได้มันจะโยนIOError
ไฟล์. ถ้าทำได้เราจะเปิดไฟล์และพิมพ์เนื้อหา ดังนั้นแทนที่จะถามบางสิ่งที่เรากำลังพยายามทำอยู่ ถ้าได้ผลเยี่ยม! หากเราไม่จับข้อผิดพลาดและจัดการกับมัน
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())
ฉันเรียกมันว่า "การเขียนโปรแกรมในแง่ดี" แนวคิดก็คือคนส่วนใหญ่มักจะทำสิ่งที่ถูกต้องและข้อผิดพลาดควรมีน้อย ดังนั้นควรเขียนโค้ดก่อนเพื่อให้ "สิ่งที่ถูกต้อง" เกิดขึ้นจากนั้นจึงตรวจจับข้อผิดพลาดหากไม่เป็นเช่นนั้น
ความรู้สึกของฉันคือหากผู้ใช้กำลังจะทำผิดพลาดพวกเขาควรเป็นผู้ที่ต้องทนทุกข์ทรมานกับผลของเวลา ผู้ที่ใช้เครื่องมืออย่างถูกวิธีจะได้รับความรวดเร็ว