Isso é menos uma pergunta sobre a natureza da digitação de patos e mais sobre permanecer pitônico, suponho.
Primeiro de tudo - ao lidar com ditados, em particular quando a estrutura do ditado é razoavelmente previsível e uma determinada chave normalmente não está presente, mas às vezes existe, primeiro penso em duas abordagens:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
E, claro, Ye Olde 'perdão versus permissão'.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Como um viajante Python, sinto que vejo o último preferido, o que só me parece estranho, porque os documentos do Python try/excepts
parecem preferidos quando há um erro real, em oposição a um ... hum ... ausência de sucesso?
Se o ditado ocasional não tiver chave no myDict e for sabido que nem sempre terá essa chave, é uma tentativa / exceto contextualmente enganosa? Este não é um erro de programação, é apenas um fato dos dados - esse ditado simplesmente não tinha essa chave específica.
Isso parece particularmente importante quando você olha para a sintaxe try / except / else, que parece ser realmente útil quando se trata de garantir que a tentativa não esteja capturando muitos erros. Você é capaz de fazer algo como:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Isso não levará a engolir todos os tipos de erros estranhos que provavelmente são resultado de algum código incorreto? O código acima pode estar impedindo você de ver que você está tentando adicionar 2 + {}
e você pode nunca perceber que alguma parte do seu código está terrivelmente errada. Eu não sugiro que devemos verificar todos os tipos, é por isso que é Python e não JavaScript - mas, novamente, com o contexto de try / except, parece que ele deve pegar o programa fazendo algo que não deveria estar fazendo. de permitir que ele continue.
Sei que o exemplo acima é uma espécie de argumento de palha e é de fato intencionalmente ruim. Mas, dado o credo pitônico de better to ask forgiveness than permission
que não posso ajudar, sinto que ele sugere a questão de onde a linha na areia está entre a aplicação correta de if / else vs try / except, especialmente quando você sabe o que esperar os dados com os quais você está trabalhando.
Não estou nem falando de preocupações com velocidade ou práticas recomendadas aqui, estou meio que confuso com o diagrama de Venn percebido de casos em que parece que poderia ser de qualquer maneira, mas as pessoas erram ao lado de uma tentativa / exceto porque 'alguém em algum lugar disse que era pitônico'. Eu tirei conclusões erradas sobre a aplicação desta sintaxe?