Đây không phải là một câu hỏi về bản chất của việc gõ vịt và nhiều hơn về việc ở lại pythonic, tôi cho rằng.
Trước hết - khi xử lý các dicts, đặc biệt là khi cấu trúc của dict khá dễ đoán và một khóa nhất định thường không xuất hiện nhưng đôi khi, trước tiên, tôi nghĩ đến hai cách tiếp cận:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
Và dĩ nhiên, cách tiếp cận 'tha thứ và cho phép' của Ye Olde.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Là một người hành trình Python, tôi cảm thấy như tôi thấy cái sau được ưa thích hơn rất nhiều, điều mà tôi chỉ cảm thấy kỳ lạ bởi vì trong các tài liệu Python try/excepts
dường như được ưa thích khi có một sai lầm thực sự, trái ngược với sự thiếu vắng thành công?
Nếu dict thỉnh thoảng không có khóa trong myDict và được biết rằng nó sẽ không luôn luôn có khóa đó, đó có phải là một thử / ngoại trừ sai lệch theo ngữ cảnh? Đây không phải là lỗi lập trình, đó chỉ là sự thật của dữ liệu - chính tả này không có khóa cụ thể đó.
Điều này có vẻ đặc biệt quan trọng khi bạn nhìn vào cú pháp try / trừ / khác, có vẻ như thực sự hữu ích khi đảm bảo rằng thử không bắt quá nhiều lỗi. Bạn có thể làm một cái gì đó như:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Không phải điều đó sẽ dẫn đến việc nuốt tất cả các loại lỗi lạ có lẽ là kết quả của một số mã xấu? Đoạn mã trên có thể khiến bạn không thể thấy rằng bạn đang cố thêm 2 + {}
và bạn có thể không bao giờ nhận ra rằng một phần mã của bạn đã bị sai một cách khủng khiếp. Tôi không khuyên chúng ta nên kiểm tra tất cả các loại, đó là lý do tại sao đó là Python chứ không phải JavaScript - nhưng một lần nữa với bối cảnh thử / ngoại trừ, có vẻ như phải bắt chương trình làm điều gì đó không nên làm, thay vào đó cho phép nó tiếp tục.
Tôi nhận ra ví dụ trên là một cái gì đó của một cuộc tranh luận người rơm, và trên thực tế là cố ý xấu. Nhưng với tín ngưỡng pythonic của better to ask forgiveness than permission
tôi, tôi không thể không cảm thấy như nó đặt ra câu hỏi về việc dòng trên cát thực sự nằm ở đâu giữa ứng dụng chính xác của if / other vs try / trừ, đặc biệt là khi bạn biết những gì sẽ xảy ra dữ liệu bạn đang làm việc với.
Tôi thậm chí không nói về mối quan tâm về tốc độ hoặc thực tiễn tốt nhất ở đây, tôi chỉ bị bối rối một cách lặng lẽ bởi sơ đồ Venn nhận thức về các trường hợp có vẻ như nó có thể đi theo bất kỳ cách nào, nhưng mọi người đều thất bại trong việc thử / ngoại trừ bởi vì "ai đó ở đâu đó nói rằng đó là Pythonic". Tôi đã rút ra kết luận sai về việc áp dụng cú pháp này chưa?