一行异常处理

新手上路,请多包涵

在 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.

原文由 2Cubed 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 572
2 个回答

在 python 中不可能做一行异常处理语句。可以编写一个函数来执行此操作。

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

原文由 pppery 发布,翻译遵循 CC BY-SA 3.0 许可协议

可以在一行中使用 exec:

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

原文由 user6035995 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题