Supongo que se trata menos de la naturaleza de la tipificación de patos y más acerca de mantenerse pitónico.
En primer lugar, cuando se trata de dictados, en particular cuando la estructura del dict es bastante predecible y una clave dada generalmente no está presente, pero a veces lo está, primero pienso en dos enfoques:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
Y, por supuesto, el enfoque de 'perdón versus permiso' de Ye Olde.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Como jornalero de Python, siento que veo que este último prefiere mucho, lo que solo se siente extraño, supongo porque en los documentos de Python try/exceptsparece preferirse cuando hay un error real, en lugar de una, um ... ¿ ausencia de éxito?
Si el dict ocasional no tiene clave en myDict, y se sabe que no siempre tendrá esa clave, ¿ es un try / except contextualmente engañoso? Esto no es un error de programación, es solo un hecho de los datos, este dict simplemente no tenía esa clave en particular.
Esto parece particularmente importante cuando observa la sintaxis try / except / else, que parece ser realmente útil cuando se trata de asegurarse de que try no detecte demasiados errores. Eres capaz de hacer algo como:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
¿No conducirá eso a tragar todo tipo de errores extraños que probablemente sean el resultado de algún código incorrecto? El código anterior podría estar evitando que vea que está tratando de agregar 2 + {}y es posible que nunca se dé cuenta de que una parte de su código ha salido terriblemente mal. No sugiero que debamos verificar todos los tipos, es por eso que es Python y no JavaScript, pero nuevamente con el contexto de try / except, parece que se supone que debe atrapar al programa haciendo algo que no debería estar haciendo, en su lugar de permitirle continuar.
Me doy cuenta de que el ejemplo anterior es una especie de argumento de hombre de paja, y de hecho es intencionalmente malo. Pero dado el credo pitónico de better to ask forgiveness than permissionNo puedo evitar sentir que plantea la pregunta de dónde está realmente la línea en la arena entre la aplicación correcta de if / else vs try / except es, en particular cuando sabes qué esperar de los datos con los que estás trabajando.
Ni siquiera estoy hablando de preocupaciones de velocidad o mejores prácticas aquí, estoy un poco confundido por el diagrama de Venn percibido de casos en los que parece que podría ir de cualquier manera, pero la gente se equivoca al lado de un intento / excepto porque 'alguien en alguna parte dijo que era Pythonic'. ¿He sacado conclusiones erróneas sobre la aplicación de esta sintaxis?