Manejo de excepciones de una línea

En Python, es posible usar one-liners para establecer valores con condiciones especiales (como valores predeterminados o condiciones) de una manera sencilla e intuitiva.

result = 0 or "Does not exist." # "Does not exist." result = "Found user!" if user in user_list else "User not found." 

¿Es posible escribir una statement similar que atrapa excepciones?

 from json import loads result = loads('{"value": true}') or "Oh no, explosions occurred!" # {'value': True} result = loads(None) or "Oh no, explosions occurred!" # "Oh no, explosions occurred!" is desired, but a TypeError is raised. 

No es posible hacer una statement de control de excepciones de una línea en python. Uno podría escribir una función para hacer esto.

 def safe_execute(default, exception, function, *args): try: return function(*args) except exception: return default 

Ejemplo de uso:

 from json import loads safe_execute("Oh no, explosions occurred!", TypeError, loads, None) # Returns "Oh no, explosions occurred!" safe_execute("Huh?", TypeError, int, "10") #Returns 10 

Se admiten múltiples argumentos

 from operator import div safe_execute( "Divsion by zero is invalid.", ZeroDivisionError, div, 1, 0 ) # Returns "Divsion by zero is invalid." safe_execute( "Divsion by zero is invalid.", ZeroDivisionError, div, 1, 1 ) # Returns 1. 

El proceso de captura de errores todavía puede ser interrumpido:

 from time import sleep safe_execute( "Panic!", Exception, sleep, 8 ) # Ctrl-c will raise a KeyboardInterrupt from sys import exit safe_execute("Failed to exit!", Exception, exit) # Exits the Python interpreter 

Si este comportamiento no es deseado, use BaseException :

 from time import sleep safe_execute("interrupted", BaseException, sleep, 8) #Pressing Ctrl-c will return "interrupted" from sys import exit safe_execute("Naughty little program!", BaseException, exit) #Returns "Naughty little program!" 

Es posible en una línea usando exec:

 parse_float = lambda x, y=exec("def f(s):\n try:\n return float(s)\n except: return None"): f(x)