web-dev-qa-db-fra.com

Traitement des exceptions sur une ligne

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.
14
2Cubed

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!"
19
ppperry

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)
2
Miklos Horvath