Python 无参数和带参数的decorator
无参数的decorator
def
fn(*args,**kw):
t1 = time.time()
r = f(*args,**kw)
t2 = time.time()
print 'call %s() in %fs'
%(f.__name__,(t2-t1))
return r
return fn
return reduce(lambda
x,y: x*y, range(1, n+1))
def
perf_decorator(f):
def
wrapper(*args,**kw):
t1 = time.time()
r = f(*args,**kw)
t2 = time.time()
t = t2-t1
if unit != 'ms':
t = t*1000
print 'call %s in
%f%s'%(f.__name__,t,unit)
return r
return
wrapper
return
perf_decorator
return reduce(lambda
x,y: x*y, range(1, n+1))
def performance(f):
@performance
def factorial(n):
print factorial(10)
输出结果:
call factorial() in
0.000336s
3628800
带参数的decorator
import time
def performance(unit):
@performance('ms')
def factorial(n):
print factorial(10)
输出结果:
call factorial in 0.000332ms
3628800
理解执行顺序:
#perforance('ms')(factorial)
先调用第一层decorator 得到return 是perf_decorator(f) 这个函数
然后再将factorial 传入到f中得到修饰
完善decorator
import time, functools
def performance(unit):
def perf_decorator(f):
@functools.wraps(f) #此句如果不加将打印出wrapper为函数名
def wrapper(*args,**kw):
t1 = time.time()
r =f(*args,**kw)
t2 = time.time()
t = t2- t1
if unit!='ms':
t = t*1000
print 'call %s in %f %s'%(f.__name__,t,unit)
return r
return wrapper
return perf_decorator
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial.__name__
输出:factorial
浙公网安备 33010602011771号