Tengo una lista de comprensión en Python en la que cada iteración puede arrojar una excepción.¿Cómo puedo manejar excepciones en una lista de comprensión en Python?
Por ejemplo, si tengo:
eggs = (1,3,0,3,2)
[1/egg for egg in eggs]
que obtendrá una excepción de ZeroDivisionError
en el 3er elemento.
¿Cómo puedo manejar esta excepción y continuar la ejecución de la lista de comprensión?
La única manera que se me ocurre es utilizar una función auxiliar:
def spam(egg):
try:
return 1/egg
except ZeroDivisionError:
# handle division by zero error
# leave empty for now
pass
Pero esto parece un poco complicado para mí.
¿Existe alguna forma mejor de hacerlo en Python?
Nota: Este es un ejemplo sencillo (ver "por ejemplo" más arriba) que ingenié porque mi ejemplo real requiere un poco de contexto. No estoy interesado en evitar dividir por cero errores, pero en el manejo de excepciones en una lista de comprensión.
Hay una [PEP 463] (https://www.python.org/dev/peps/pep-0463/) para añadir una expresión de manejar excepciones. En su ejemplo, sería '[1/egg excepto ZeroDivisionError: None para egg in (1,3,0,3,2)]'. Pero todavía está en modo borrador. Mi instinto es que no va a ser aceptado. Las expresiones de Imho pueden volverse demasiado complicadas (ver múltiples excepciones, tener combinaciones más complejas (operadores lógicos múltiples, comprensiones complejas, etc.) – cfi
Tenga en cuenta que para este ejemplo * específico *, podría usar un numpy 'ndarray' con las configuraciones apropiadas en' np. seterr'. Eso daría como resultado '1/0 = nan'. Pero me doy cuenta de que no se generaliza a otras situaciones donde surge esta necesidad. – gerrit