One-Line Exception Handling

前端 未结 2 404
刺人心
刺人心 2020-12-14 08:22

In Python, it is possible to use one-liners to set values with special conditions (such as defaults or conditions) in a simple, intuitive way.

result = 0 or          


        
相关标签:
2条回答
  • 2020-12-14 08:59

    It is not possible to do a one-line exception-handling statement in python. One could write a function to do this.

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

    Example usage:

    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
    

    Multiple arguments are supported

    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.
    

    The error-catching process may still be interrupted:

    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
    

    If this behavior is undesired, use 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 讨论(0)
  • 2020-12-14 09:05

    It is possible in one line using exec:

    parse_float = lambda x, y=exec("def f(s):\n try:\n  return float(s)\n except:  return None"): f(x)
    
    0 讨论(0)
提交回复
热议问题