Python:除了作为一个表达式之外,尝试一下?

2024-06-16 12:42:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现自己一遍又一遍地有这样的模式:

variable = ""
try:
    variable = ... do some file loading stuff ...
except:
    variable = ""

有没有办法把它浓缩成一个表达式?像if else语句一样,您可以转换:

variable = ""
if something:
    variable = somethingelse
else:
    variable = ""

进入

variable = somethingelse if something else ""

试一试有没有类似的东西?


Tags: if表达式模式somevariabledoelsesomething
3条回答

下面是一个上下文管理器,它提供了一点快捷方式:

from contextlib import contextmanager

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

用法:

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

print x                    # prints 0, the default

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

对于生成单个值的多行计算可能特别有用。

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

variable = try_except(do_some_file_loading_stuff, lambda: '')

我认为代码是不言而喻的。它返回由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

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

def try_except(success, failure, *exceptions):
    try:
        return success()
    except exceptions or Exception:
        return failure() if callable(failure) else failure

此版本:

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

  2. 支持对故障值使用普通值和函数。这就省去了你在很多情况下使用lambda。(当然,您可以使用str,而不是lambda: ''。)

相关问题 更多 >