Vous entendez souvent que Python encourage le style EAFP ("il est plus facile de demander pardon que la permission") par rapport au style LBYL ("regardez avant de sauter"). Pour moi, c'est une question d'efficacité et de lisibilité.
Dans votre exemple (disons qu'au lieu de renvoyer une liste ou une chaîne vide, la fonction devait renvoyer une liste ou None
), si vous vous attendez à ce que 99% du temps result
contienne réellement quelque chose d'itérable, j'utiliserais l' try/except
approche. Ce sera plus rapide si les exceptions sont vraiment exceptionnelles. Si result
c'est None
plus de 50% du temps, l'utilisation if
est probablement meilleure.
Pour soutenir cela avec quelques mesures:
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking
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, alors qu'une if
déclaration vous coûte toujours , il est presque gratuit de mettre en place un try/except
blocage. Mais lorsqu'un Exception
problème survient réellement, le coût est beaucoup plus élevé.
Moral:
- C'est parfaitement OK (et "pythonique") à utiliser
try/except
pour le contrôle de flux,
- mais cela a plus de sens quand les
Exception
s sont réellement exceptionnels.
À partir de la documentation Python:
EAFP
Plus facile de demander pardon que la permission. Ce style de codage Python commun suppose l'existence de clés ou d'attributs valides et intercepte les exceptions si l'hypothèse s'avère fausse. Ce style propre et rapide se caractérise par la présence d' un grand nombre
try
et except
déclarations. La technique contraste avec le
style LBYL commun à de nombreux autres langages tels que C.