web-dev-qa-db-ja.com

1行の例外処理

Pythonでは、ワンライナーを使用して、単純で直感的な方法で特別な条件(デフォルトや条件など)を使用して値を設定できます。

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

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!"
22
pppery

Execを使用すると1行で可能です。

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