[英]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.