Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如果函数或表达式失败,则返回默认值_Python_Functional Programming - Fatal编程技术网

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

Python:如果函数或表达式失败,则返回默认值,python,functional-programming,Python,Functional Programming,Python是否有一个特性,允许对函数或表达式求值,如果求值失败(引发异常),则返回默认值 伪代码: 计算器(函数/表达式,默认值) 计算器将尝试执行函数或表达式,如果执行成功,则返回结果,否则返回默认值 我知道我使用try和创建了一个用户定义的功能,除了之外,我想知道在启动并创建自定义解决方案之前是否已经包括了电池。否,标准方法是使用try。。。除了 函数中没有隐藏或抑制任何泛型异常的机制。我怀疑很多Python用户会考虑使用这样的函数是不带python的两个原因: 它隐藏了特定异常发生的相关

Python是否有一个特性,允许对函数或表达式求值,如果求值失败(引发异常),则返回默认值

伪代码:
计算器(函数/表达式,默认值)

计算器
将尝试执行函数或表达式,如果执行成功,则返回结果,否则返回
默认值


我知道我使用
try
创建了一个用户定义的功能,除了
之外,我想知道在启动并创建自定义解决方案之前是否已经包括了电池。

否,标准方法是使用
try。。。除了

函数中没有隐藏或抑制任何泛型异常的机制。我怀疑很多Python用户会考虑使用这样的函数是不带python的两个原因:

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

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

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


    虽然<代码>尝试。。。除了
    表单可能有点冗长之外,我认为它在清楚显示异常可能发生的位置以及异常周围的控制流方面有很多优势。

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

    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!
    

    不,您需要创建自己的函数才能使用return实现这一点。您可以创建一个装饰函数(接受默认值)并用它装饰您的函数。这绝对是一个有趣的问题。Python确实为非常特定的常见情况提供了一些异常隐藏函数,例如
    dict.get(key,default_value)
    ,如果字典不包含指定的key,它可以避免出现
    KeyError
    异常。是。这种结构的概念/想法很容易理解,但可能一个广义的实现会带来其他问题。