"Sử dụng nguyên tắc EAFP" trong Python là gì? Bạn có thể cung cấp bất kỳ ví dụ?
"Sử dụng nguyên tắc EAFP" trong Python là gì? Bạn có thể cung cấp bất kỳ ví dụ?
Câu trả lời:
Từ bảng chú giải :
Dễ dàng yêu cầu sự tha thứ hơn sự cho phép. Kiểu mã hóa Python phổ biến này giả định sự tồn tại của các khóa hoặc thuộc tính hợp lệ và bắt ngoại lệ nếu giả định chứng minh là sai. Phong cách sạch sẽ và nhanh chóng này được đặc trưng bởi sự hiện diện của nhiều
try
vàexcept
tuyên bố. Kỹ thuật này tương phản với phong cách LBYL phổ biến đối với nhiều ngôn ngữ khác như C.
Một ví dụ sẽ là một nỗ lực để truy cập khóa từ điển.
EAFP:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
LBYL:
if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
Phiên bản LBYL phải tìm kiếm khóa trong từ điển hai lần và cũng có thể được coi là ít đọc hơn.
x
khi khóa không tồn tại: x = mydict.get('key')
sẽ trả về None
nếu 'key'
không có trong my_dict
; bạn cũng có thể làm .get('key', <something>)
, và sau đó x sẽ được chỉ định một cái gì đó nếu khóa không có trong từ điển. dict.setdefault()
và collections.defaultdict
là những điều tốt đẹp để tránh mã thừa là tốt.
except KeyError
cũng như AttributeError
đơn giản nhưng một số ví dụ tồi tệ nhất. Vì vậy, nhiều lần tôi đã bị mắc kẹt trong việc gỡ lỗi một cái gì đó vì except AttributeError
đặt sai vị trí, cuối cùng bắt lỗi sai thuộc tính được nâng sâu hơn trong chuỗi. Ví dụ tốt hơn tôi nghĩ là : try: open() ... except: IOError
. Hoặctry: parseLine() ... except ParseError
Tôi sẽ cố gắng giải thích nó với một ví dụ khác.
Ở đây chúng tôi đang cố gắng truy cập tệp và in nội dung trong bảng điều khiển.
Chúng tôi có thể muốn kiểm tra xem chúng tôi có thể truy cập tệp không và nếu có thể, chúng tôi sẽ mở tệp và in nội dung. Nếu chúng tôi không thể truy cập vào tập tin, chúng tôi sẽ nhấn else
một phần. Lý do đây là một điều kiện cuộc đua là vì trước tiên chúng tôi thực hiện kiểm tra truy cập. Vào thời điểm chúng tôi đạt được, with open(my_file) as f:
có thể chúng tôi không thể truy cập được nữa do một số vấn đề về quyền (ví dụ: một quy trình khác có được khóa tệp độc quyền). Mã này có thể sẽ gây ra lỗi và chúng tôi sẽ không thể bắt lỗi đó vì chúng tôi nghĩ rằng chúng tôi có thể truy cập tệp.
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")
Trong ví dụ này, chúng tôi chỉ cố mở tệp và nếu chúng tôi không thể mở tệp, nó sẽ ném IOError
. Nếu có thể, chúng tôi sẽ mở tệp và in nội dung. Vì vậy, thay vì yêu cầu một cái gì đó chúng tôi đang cố gắng để làm điều đó. Nếu nó hoạt động, thật tuyệt! Nếu không, chúng tôi bắt lỗi và xử lý nó.
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())
Tôi gọi nó là "lập trình lạc quan". Ý tưởng là hầu hết thời gian mọi người sẽ làm đúng, và lỗi là rất ít. Vì vậy, mã đầu tiên cho "điều đúng" xảy ra, và sau đó bắt lỗi nếu chúng không xảy ra.
Cảm giác của tôi là nếu một người dùng sẽ phạm sai lầm, họ sẽ là người phải chịu hậu quả về thời gian. Những người sử dụng công cụ đúng cách được tăng tốc.