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

mat*_*thu 4 python functional-programming

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

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

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

我知道我使用try和创建了一个用户定义的函数,except但是我想知道在开始创建自定义解决方案之前是否已经包含了电池.

alf*_*sin 5

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

def handle_exceptions(default):
    def wrap(f):
        def inner(*a):
            try:
                return f(*a)
            except Exception, e:
                return default
        return inner
    return wrap
Run Code Online (Sandbox Code Playgroud)

现在让我们看一个例子:

@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!
Run Code Online (Sandbox Code Playgroud)


Dan*_*ski 3

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

没有机制可以隐藏或抑制函数内的任何通用异常。我怀疑许多 Python 用户会认为随意使用这样的函数是不符合 Python 风格的,原因如下:

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

  2. 它隐藏了异常发生的事实;发生异常时返回的默认值可能与有效的非默认值一致。(有时合理,有时则不然。)

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

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