Python:try-except作为表达式?

Li *_*oyi 24 python

我发现自己一遍又一遍地拥有这种模式:

variable = ""
try:
    variable = ... do some file loading stuff ...
except:
    variable = ""
Run Code Online (Sandbox Code Playgroud)

有没有办法将它压缩成一个表达式?与if-else语句一样,您可以转向:

variable = ""
if something:
    variable = somethingelse
else:
    variable = ""
Run Code Online (Sandbox Code Playgroud)

variable = somethingelse if something else ""
Run Code Online (Sandbox Code Playgroud)

try-catch有没有相同的东西?

kin*_*all 19

由于agf已经提供了我推荐的方法,这里是他的例程的一个版本,有一些小的改进:

def try_except(success, failure, *exceptions):
    try:
        return success()
    except exceptions or Exception:
        return failure() if callable(failure) else failure
Run Code Online (Sandbox Code Playgroud)

这个版本:

  1. 允许您准确指定将作为附加可选参数捕获的异常.您应始终捕获将执行此任务的最小异常集,并让您无法处理的异常冒泡到调用方.

  2. 支持使用普通值以及故障值的函数.这可以节省您在很多情况下使用lambda的麻烦.(当然,而不是lambda: ''你可以使用str.)


agf*_*agf 15

def try_except(success, failure):
    try:
        return success()
    except:
        return failure()

variable = try_except(do_some_file_loading_stuff, lambda: '')
Run Code Online (Sandbox Code Playgroud)

我认为代码是自我解释的.它返回返回的值success,除非有错误,则返回返回的值failure.如果do_some_file_loading_stuff是表达式而不仅仅是函数调用,也将它包装在一个表达式中lambda.

编辑: @kindall和我改进了他的版本,所以它和我的一样快,如果你想要的话可​​以被称为完全相同,有更多的功能,并且是相同的行数.用它!

def try_except(success, failure, *exceptions):
    try:
        return success()
    except exceptions or Exception:
        return failure() if callable(failure) else failure
Run Code Online (Sandbox Code Playgroud)


kin*_*all 13

这是一个提供一点快捷方式的上下文管理器:

from contextlib import contextmanager

@contextmanager
def catch(*exceptions, **kwargs):
    try:
        yield kwargs.get("default", None)
    except exceptions or Exception:
        pass
Run Code Online (Sandbox Code Playgroud)

用法:

with catch(ZeroDivisionError, default=0) as x:
    x = 3 / 0              # error

print x                    # prints 0, the default
Run Code Online (Sandbox Code Playgroud)

这里的基本思想是上下文管理器返回您传递的任何默认值,然后将其分配给您在with语句as子句中指定的变量.然后,在上下文中,执行一个尝试分配给同一个变量的语句.如果它引发异常,则上下文管理器捕获并静默忽略它,但由于分配没有发生,因此保留默认值.

可能对多行计算特别有用,但仍会产生单个值.