C'est moins une question sur la nature de la frappe de canard que sur la façon de rester pythonique, je suppose.
Tout d'abord - lorsqu'il s'agit de dictés, en particulier lorsque la structure du dict est assez prévisible et qu'une clé donnée n'est généralement pas présente mais l'est parfois, je pense d'abord à deux approches:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
Et bien sûr, l'approche du pardon contre la permission de Ye Olde.
try:
do_some_work(dict[myKey])
except KeyError:
pass
En tant que compagnon gars Python, j'ai l'impression que je vois ce dernier beaucoup préféré, ce qui ne me semble étrange que parce que dans les documents Python try/excepts
semblent être préférés quand il y a une erreur réelle, par opposition à une, euh ... absence de succès?
Si le dict occasionnel n'a pas de clé dans myDict, et on sait qu'il n'aura pas toujours cette clé, un essai / sauf contextuellement trompeur? Ce n'est pas une erreur de programmation, c'est juste un fait des données - ce dict n'a tout simplement pas cette clé particulière.
Cela semble particulièrement important lorsque vous regardez la syntaxe try / except / else, qui semble être vraiment utile lorsqu'il s'agit de s'assurer que try ne détecte pas trop d'erreurs. Vous pouvez faire quelque chose comme:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Cela ne va-t-il pas conduire à avaler toutes sortes d'erreurs étranges qui sont probablement le résultat d'un mauvais code? Le code ci-dessus pourrait simplement vous empêcher de voir que vous essayez d'ajouter 2 + {}
et vous ne réaliserez peut-être jamais qu'une partie de votre code a horriblement mal tourné. Je ne suggère pas que nous devrions vérifier tous les types, c'est pourquoi c'est Python et non JavaScript - mais encore une fois avec le contexte de try / except, il semble qu'il est censé attraper le programme en train de faire quelque chose qu'il ne devrait pas faire, à la place de lui permettre de continuer.
Je me rends compte que l'exemple ci-dessus est quelque chose d'un argument de l'homme de paille, et est en fait intentionnellement mauvais. Mais étant donné le credo pythonique de, better to ask forgiveness than permission
je ne peux m'empêcher de penser que cela pose la question de savoir où se situe réellement la ligne entre l'application correcte de if / else vs try / except, en particulier lorsque vous savez à quoi vous attendre de les données avec lesquelles vous travaillez.
Je ne parle même pas des problèmes de vitesse ou des meilleures pratiques ici, je suis juste un peu confus par le diagramme Venn perçu des cas où il semble que cela pourrait aller dans les deux sens, mais les gens se trompent du côté d'un essai / sauf parce que «quelqu'un quelque part a dit que c'était Pythonic». Ai-je tiré des conclusions erronées sur l'application de cette syntaxe?