En Python, il est possible d’utiliser une ligne pour définir des valeurs avec des conditions spéciales (telles que les valeurs par défaut ou les conditions) de manière simple et intuitive.
result = 0 or "Does not exist." # "Does not exist."
result = "Found user!" if user in user_list else "User not found."
Est-il possible d'écrire une déclaration similaire qui intercepte des exceptions?
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.
Il n'est pas possible de faire une instruction de gestion d'exception d'une ligne en python. On pourrait écrire une fonction pour faire cela.
def safe_execute(default, exception, function, *args):
try:
return function(*args)
except exception:
return default
Exemple d'utilisation:
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
Plusieurs arguments sont supportés
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.
Le processus de capture d'erreur peut encore être interrompu:
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 ce comportement n'est pas souhaité, utilisez 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!"
C'est possible en une seule ligne en utilisant exec:
parse_float = lambda x, y=exec("def f(s):\n try:\n return float(s)\n except: return None"): f(x)