此代码的工作原理如何?它来自第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
答案 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)