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 result
realmente contenga algo iterable, usaría el try/except
enfoque. Será más rápido si las excepciones son realmente excepcionales. Si result
es None
má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 if
declaración siempre le cuesta, es casi gratis configurar un try/except
bloque. Pero cuando Exception
ocurre realmente, el costo es mucho mayor.
Moral:
- Está perfectamente bien (y "pitónico") usar
try/except
para el control de flujo,
- pero tiene más sentido cuando los
Exception
s 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
try
y except
declaraciones. La técnica contrasta con el
estilo LBYL común a muchos otros lenguajes como C.