Python:如果函数或表达式失败,则返回默认值

时间:2014-09-15 06:27:00

标签: python functional-programming

Python是否具有允许评估函数或表达式的功能,如果评估失败(引发异常),则返回默认值。

的伪代码: evaluator(function/expression, default_value)

evaluator将尝试执行函数或表达式并返回结果是执行成功,否则返回default_value

我知道我使用tryexcept创建了一个用户定义的函数来实现这一目标,但我想知道在关闭和创建自定义解决方案之前是否已经包含电池。

2 个答案:

答案 0 :(得分:5)

为了重用代码,你可以创建一个装饰函数(接受一个默认值)并用它来装饰你的函数:

def handle_exceptions(default):
    def wrap(f):
        def inner(*a):
            try:
                return f(*a)
            except Exception, e:
                return default
        return inner
    return wrap

现在让我们看一个例子:

@handle_exceptions("Invalid Argument")
def test(num):
    return 15/num

@handle_exceptions("Input should be Strings only!")
def test2(s1, s2):
    return s2 in s1    

print test(0) # "Invalid Argument"
print test(15) # 1

print test2("abc", "b") # True
print test2("abc", 1) # Input should be Strings only!

答案 1 :(得分:2)

不,执行此操作的标准方法是使用try... except

没有机制隐藏或抑制函数中的任何泛型异常。我怀疑许多Python用户会考虑不加思索地使用这样的函数而不是Pythonic,原因如下:

  1. 隐藏有关特定异常发生的信息。 (您可能不希望处理所有异常,因为某些异常可能来自其他库并指示程序无法恢复的条件,例如磁盘空间不足。)

  2. 它隐藏了一个异常发生的事实;在异常情况下返回的默认值可能与有效的非默认值一致。 (有时候是合理的,有时候并非如此。)

  3. 我认为,Pythonic哲学的一个原则是“显式优于隐式”,因此Python通常避免自动类型转换和错误恢复,这是Perl等更多“隐式友好”语言的特性。

    虽然try... except形式可能有点冗长,但在我看来,它在清楚地显示异常可能发生的位置以及围绕该异常的控制流方面具有很多优势。