A menudo escuchas que Python alienta el estilo EAFP ("es más fácil pedir perdón que permiso") que el estilo LBYL ("mira antes de saltar"). Para mí, es una cuestión de eficiencia y legibilidad.
En su ejemplo (digamos que en lugar de devolver una lista o una cadena vacía, la función era devolver una lista o None), si espera que el 99% del tiempo resultrealmente contenga algo iterable, usaría el try/exceptenfoque. Será más rápido si las excepciones son realmente excepcionales. Si resultes Nonemás del 50% del tiempo, entonces usandoif probablemente sea mejor .
Para apoyar esto con algunas medidas:
>>> 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
Entonces, mientras que una ifdeclaración siempre le cuesta, es casi gratis configurar un try/exceptbloque. Pero cuando Exceptionocurre realmente, el costo es mucho mayor.
Moral:
- Está perfectamente bien (y "pitónico") usar
try/exceptpara el control de flujo,
- pero tiene más sentido cuando los
Exceptions son realmente excepcionales.
De los documentos de Python:
EAFP
Es más fácil pedir perdón que permiso. Este estilo común de codificación de Python supone la existencia de claves o atributos válidos y captura excepciones si el supuesto resulta falso. Este estilo limpio y rápido se caracteriza por la presencia de muchos
tryy exceptdeclaraciones. La técnica contrasta con el
estilo LBYL común a muchos otros lenguajes como C.