python中的函数装饰器安全性

时间:2016-10-29 17:12:23

标签: python decorator

此代码的工作原理如何?它来自第8章"数据科学由Scratch"从渐变。为什么我需要在另一个函数中包含一个函数?是否有更可读的方法来实现此execption处理?这是对它的解释。

  

某些步长可能会导致我们的功能输入无效。所以我们需要创建一个“安全应用”函数,它返回无效输入的无穷大(永远不应该是任何东西的最小值):

def safe(f):
    """return a new function that's the same as f,
    except that it outputs infinity whenever f produces an error"""
    def safe_f(*args, **kwargs):
        try:
             return f(*args, **kwargs)
        except:
             return float('inf')
    return safe_f

2 个答案:

答案 0 :(得分:3)

您缺少函数调用:

假设我定义了一个像这样的平均函数:

def naive_average(lst):
    return float(sum(lst))/len(lst)

如果lst为空,会发生什么?或者它是否包含不是数字的东西? BOOM,例外!

使用你提到的装饰器,函数看起来像这样

@safe
def naive_average(lst):
    return float(sum(lst))/len(lst)

现在,在空lst上调用它会返回float('inf')而不是异常

答案 1 :(得分:3)

假设我们有一个像这样的小功能:

def myfunc(n):
    return 42/n

我们这样做:

print(myfunc(0))

我们得到了这个:

Traceback (most recent call last):
  File "gash.py", line 14, in <module>
    print(myfunc(0))
  File "gash.py", line 12, in myfunc
    return 42/n
ZeroDivisionError: division by zero

现在我们这样做:

myfunc = safe(myfunc)
print(myfunc(0))

我们得到了这个:

inf

我们第二次调用safe(),它返回一个带嵌入式异常处理的新函数。我们替换 name &#34; myfunc&#34;指的是,现在它指的是返回的函数。原始myfunc不会丢失,在新内容中称为f

@safe装饰器基本上与myfunc = safe(myfunc)

做同样的事情