繁体   English   中英

Python中的函数装饰器安全性

[英]Functions decorator safety in python

该代码如何工作? 它来自梯度的“数据科学,从零开始”的第8章。 为什么我需要在另一个函数中包装一个函数? 有没有更可读的方法来实现这种执行处理? 这是它的解释。

某些步长可能会导致我们的功能输入无效。 因此,我们需要创建一个“安全应用”函数,以对无效输入返回无穷大(永远不应为最小):

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

您缺少函数调用:

可以说我定义了一个平均函数,如下所示:

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')而不是异常

可以说我们有一个琐碎的函数,像这样:

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() ,它返回带有嵌入式异常处理的新函数。 我们替换了名称 “ myfunc”所指的内容,现在它指的是返回的函数。 原来的myfunc不会丢失,它在新的myfunc中被称为f

@safe装饰器实际上与myfunc = safe(myfunc)做相同的事情

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM