Полагаю, это не столько вопрос о характере типизации утки, сколько о том, как остаться питоническим.
Прежде всего - когда речь идет о диктовках, в частности, когда структура диктовок достаточно предсказуема, а данный ключ обычно не присутствует, но иногда это так, я сначала думаю о двух подходах:
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 не имеет ключа в myDict, и известно, что он не всегда будет иметь этот ключ, попытка / исключает контекстуально вводит в заблуждение? Это не ошибка программирования, это просто факт данных - у этого слова просто не было этого конкретного ключа.
Это кажется особенно важным, когда вы смотрите на синтаксис try / exception / else, который выглядит очень полезным, когда нужно убедиться, что попытка не перехватывает слишком много ошибок. Вы можете сделать что-то вроде:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Не приведет ли это к проглатыванию всевозможных странных ошибок, которые, вероятно, являются результатом какого-то плохого кода? Приведенный выше код может просто помешать вам увидеть, что вы пытаетесь добавить, 2 + {}
и вы, возможно, никогда не поймете, что какая-то часть вашего кода пошла ужасно неправильно. Я не предлагаю проверять все типы, поэтому это Python, а не JavaScript - но опять же с контекстом try / Кроме того, похоже, что он должен поймать программу, делающую то, что он не должен делать, вместо этого дать ему возможность продолжить.
Я понимаю, что приведенный выше пример является спорным аргументом и на самом деле намеренно плох. Но, учитывая питоническое убеждение, better to ask forgiveness than permission
я не могу не чувствовать, что возникает вопрос о том, где грань в песке на самом деле находится между правильным применением if / else против try / исключения, в частности, когда вы знаете, чего ожидать от данные, с которыми вы работаете.
Я даже не говорю о проблемах со скоростью или о лучших практиках, я просто немного сбит с толку воспринимаемой диаграммой Венна случаев, когда кажется, что это может пойти в любом случае, но люди ошибаются на стороне попытки / кроме потому что «кто-то где-то сказал, что это Pythonic». Я сделал неправильные выводы о применении этого синтаксиса?