Це менше питання про природу набору качок і більше про перебування пітоніка.
Перш за все - коли ми маємо справу з диктами, зокрема, коли структура дикта є досить передбачуваною, а конкретний ключ зазвичай не присутній, але іноді є, я спочатку думаю про два підходи:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
І звичайно, підхід "Прощення проти дозволу" Є Олді.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Як мандрівник Python хлопець, я відчуваю, що я бачу, що останній віддав перевагу багато, що здається дивним лише тому, що в Python документи, try/excepts
здається, віддають перевагу, коли є фактична помилка, на відміну від, гм ... відсутності успіху?
Якщо випадковий дикт не має ключа в моєму Dict, і відомо, що він не завжди матиме цей ключ, це спроба / за винятком контекстуально оманливого? Це не помилка програмування, це лише факт даних - у цьому диктаті просто не було саме цього ключа.
Це здається особливо важливим, коли ви дивитесь на синтаксис спробу / винятком / else, який здається дуже корисним, коли потрібно переконатися, що спроба не сприймає занадто багато помилок. Ви можете зробити щось на кшталт:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Хіба це не призведе до проковтування всіляких дивних помилок, які, ймовірно, є наслідком поганого коду? Наведений вище код може просто заважати вам бачити, що ви намагаєтеся додати, 2 + {}
і ви ніколи не можете зрозуміти, що якась частина вашого коду жахливо помилилася. Я не рекомендую нам перевіряти всі типи, саме тому це Python, а не JavaScript - але знову ж таки в контексті спроби / за винятком цього, здається, що він повинен застати програму робити те, що не повинно робити, натомість можливості його продовжувати.
Я усвідомлюю, що наведений вище приклад є чимось солом’яним аргументом, і насправді навмисно поганий. Але, враховуючи пітонічне віросповідання, better to ask forgiveness than permission
я не можу не відчути, як напрошується питання про те, де лінія в піску насправді знаходиться між правильним застосуванням if / else vs try / за винятком, зокрема, коли ви знаєте, чого чекати від дані, з якими ви працюєте.
Я навіть не кажу про проблеми, пов'язані зі швидкістю, або найкращу практику тут, я просто непомітно розгублений сприйнятою діаграмою Венна випадків, коли схоже, що це може піти в будь-який бік, але люди помиляються на стороні спроби / за винятком бо "хтось десь сказав, що це піфонічне". Я зробив неправильні висновки щодо застосування цього синтаксису?