参考并感谢大巧不工的分享
问:请编写一个decorator,能在函数调用的前后打印出’begin call’和’end call’的日志。
import functools
import time
def log(text):
def metric(fn):
@functools.wraps(fn)
def wrapper(*args,**kw):
begin=time.time()
fv=fn(*args,**kw)
end=time.time()
print('%s %s() executed in %s ms' % (text,fn.__name__,end-begin))
return fv
return wrapper
return metric
测试1:打印name
def fast(x, y):
time.sleep(0.12)
return x+y
func = log('myfunction')(fast)
print('funcName is '+func.__name__)
funcName is fast
[Finished in 0.3s]
如果把@functools.wraps(fn)去掉,那么打印出来的funcName便是metric,因为log函数返回metric,@functools.wraps(fn)相当于 wrapper.name = fn.name 测试2:
def fast(x, y):
time.sleep(0.12)
return x+y
result = log('myfunction')(fast)(1,2)
print(result)
myfunction fast() executed in 0.12011098861694336 ms
3
[Finished in 0.3s]
原式 log(‘myfunction’)(fast)(1,2) 分开解析:
第一步 log(‘myfunction’) ,返回metric,那么原式变为 metric(fast)(1,2)
第二步 metric(fast),返回 wrapper,原式变为 wrapper(1,2)
第三部执行wrapper函数,fv=fast(1,2) ,打印时间返回3
测试3: 另一种方式
@log('myfunction')
def fast(x, y):
time.sleep(0.12)
return x+y
f = fast(1,2)
print(f)
myfunction fast() executed in 0.12011098861694336 ms
3
[Finished in 0.3s]