首先引用原文中的一段话:
把@log放到now()函数的定义处,相当于执行了语句:
@log
now()
now = log(now)
做完练习之后再回顾这段话突然茅塞顿开
之前看到其他同学练习答案如下
import time
import functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args,**kw):
start=time.time()
re=fn(*args,**kw)
end=time.time()
print('%s() excute in %s s'%(fn.__name__,end-start))
return re
return wrapper
一开始纠结了很久,之前的例子里wrapper函数的返回值都是fn,为什么最后是返回re而不是返回fn。实际上,因为这里需要计算fn的运行时间,所以先用re=fn(*args,**kw)将fn运行了一遍,可以直接将re作为返回值。在这里,return re和return fn(*args,**kw),其实都是在wrapper里将fn运行了一遍。
还发现一个问题,如果这里用return fn(*args,**kw),相当于在re=fn(*args,**kw)时运行了一次fn,返回值的时候又运行了一次。
如果fn只是计算得到数值,对于整个程序并没有影响,但如果fn内部有print(xxxx)语句,那两次执行都会print,最终结果会受到影响。
你确定你打印了吗?
函数里有print,只要调用就会输出
Sign in to make a reply
松鼠Yanis
首先引用原文中的一段话:
把
@log
放到now()
函数的定义处,相当于执行了语句:做完练习之后再回顾这段话突然茅塞顿开
之前看到其他同学练习答案如下
import time
import functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args,**kw):
start=time.time()
re=fn(*args,**kw)
end=time.time()
print('%s() excute in %s s'%(fn.__name__,end-start))
return re
return wrapper
一开始纠结了很久,之前的例子里wrapper函数的返回值都是fn,为什么最后是返回re而不是返回fn。实际上,因为这里需要计算fn的运行时间,所以先用re=fn(*args,**kw)将fn运行了一遍,可以直接将re作为返回值。在这里,return re和return fn(*args,**kw),其实都是在wrapper里将fn运行了一遍。