2016-04-16 4 views
10

Pythonでは、1つのライナーを使用して、特殊な条件(デフォルトや条件など)で値を簡単で直観的に設定することができます。1行の例外処理

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

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

例外をキャッチする同様の文を書くことはできますか?

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

機能に標準 'try..except'を入れていないのはなぜ? – TigerhawkT3

+0

@Slayer興味深いことに、Pythonは実際には文字列(または実際には他のオブジェクト)を 'or'の「代替」として使用します。 '0 'または'存在しません。 '' 'は存在しません。''。 (私はそれをテストしました) – 2Cubed

+0

@ TigerhawkT3私は 'divide_one_by'関数の内部へのアクセス権がありません。依存関係として使用している別のモジュールで定義されていると仮定します。 – 2Cubed

答えて

14

pythonで1行の例外処理文を実行することはできません。これを行う関数を書くことができます。

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

使用例:

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 

複数の引数が

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. 

をサポートしているエラーを引くプロセスはまだ中断されることがあります。

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 

この動作が望ましくない場合には、 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!" 
0

それは幹部を使用して1行で可能です:

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