2016-04-16 13 views
10

Python'da, özel koşullarla (varsayılan değerler veya koşullar gibi) değerleri basit, sezgisel bir şekilde ayarlamak için tek katlı kullanmak mümkündür.Tek Hatlı İstisna İşleme

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

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

Özel durumları yakalayan benzer bir deyim yazmak mümkün mü?

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

Neden koymak değil standart 'fonksiyonu içine try..except'? – TigerhawkT3

+0

@Slayer İlginç bir şekilde, Python aslında bir dizgeyi (veya başka bir nesneyi) "or" için bir "alternatif" olarak kullanacaktır. '0 veya“ Var değil. ”' 'Geri dönmez' '. (Ben test ettim.) – 2Cubed

+0

@ TigerhawkT3 'divide_one_by' işlevinin içsellerine erişimim yok - bağımlılık olarak kullandığım ayrı bir modülde tanımlanmış olduğunu varsayalım. – 2Cubed

cevap

14

Python'da tek satırlık istisna tutma ifadesi yapmak mümkün değildir. Bunu yapmak için bir işlev yazılabilir.

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

Örnek kullanımı: bu davranış arzu edilmez

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 

ise:

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 

fazla parametre hata yakalama işlemi yine de kesilebilen

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. 

desteklenir , BaseException kullanın:

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

Bu bir çizgi kullanarak exec mümkündür:

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