On entend souvent dire que Python encourage le style EAFP ("il est plus facile de demander pardon que la permission") plutôt que le style LBYL ("regarder avant de sauter"). Pour moi, c'est une question d'efficacité et de lisibilité.
Dans votre exemple (disons que au lieu de renvoyer une liste ou une chaîne vide, la fonction renvoie une liste ou None
), si vous vous attendez à ce que 99 % du temps résultat
contienne réellement quelque chose d'itérable, j'utiliserais l'approche try/except
. Ce sera plus rapide si les exceptions sont vraiment exceptionnelles. Si résultat
est None
plus de 50 % du temps, alors utiliser if
est probablement mieux.
Pour étayer cela avec quelques mesures:
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # pas de vérification d'erreur
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.5070195056614466
>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")
0.11940114974277094
>>> timeit.timeit(setup="a=1;b=0", stmt="if b!=0:\n a/b")
0.051202772912802175
Ainsi, tandis qu'une instruction if
vous coûte toujours, il est presque gratuit de mettre en place un bloc try/except
. Mais lorsque qu'une Exception
survient réellement, le coût est beaucoup plus élevé.
Moralité:
- Il est parfaitement OK (et "pythonic") d'utiliser
try/except
pour le contrôle du flux,
- mais cela a le plus de sens lorsque les
Exception
s sont réellement exceptionnelles.
D'après la documentation Python:
EAFP
Il est plus facile de demander pardon que la permission. Ce style de codage Python courant suppose l'existence de clés ou attributs valides et capture les exceptions si l'hypothèse est fausse. Ce style propre et rapide est caractérisé par la présence de nombreuses instructions try
et except
. La technique contraste avec le style LBYL commun à de nombreux autres langages comme le C.
0 votes
Gardez à l'esprit que si votre bloc d'éléments #process est susceptible de générer une TypeError, vous devez l'encadrer dans un autre bloc try: except:. Pour cet exemple spécifique, je me contenterais d'utiliser un if: