2016-04-16 1 views
10

In Python ist es möglich, Einzeiler zu verwenden, um Werte mit speziellen Bedingungen (wie Standardwerte oder Bedingungen) auf einfache, intuitive Weise festzulegen.One-Line-Exception-Behandlung

result = 0 or "Does not exist." # "Does not exist." 

result = "Found user!" if user in user_list else "User not found." 

Ist es möglich, eine ähnliche Anweisung zu schreiben, die Ausnahmen abfängt?

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. 
+2

Warum nicht der Standard 'try..except' in die Funktion setzen? – TigerhawkT3

+0

@Slayer Interessanterweise wird Python tatsächlich eine Zeichenfolge (oder ein anderes Objekt) als "Alternative" für "oder" verwenden. '0 oder" Gibt es nicht. "' Gibt '' Existiert nicht zurück. ''. (Ich habe es getestet.) – 2Cubed

+0

@ TigerhawkT3 Ich habe keinen Zugriff auf die Interna der Funktion 'divide_one_by' - nehme an, dass es in einem separaten Modul definiert ist, das ich als Abhängigkeit verwende. – 2Cubed

Antwort

14

Es ist nicht möglich, eine einzeilige Ausnahmebehandlung in Python auszuführen. Man könnte dazu eine Funktion schreiben.

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

Beispiel Nutzung:

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 

Mehrere Argumente

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. 

Der Fehler Fang Prozess unterbrochen werden noch unterstützt:

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 

Wenn dieses Verhalten nicht erwünscht ist , BaseException verwenden:

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!" 
0

Es ist möglich, in einer Linie mit exec:

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