Python 无参数和带参数的decorator

无参数的decorator

def performance(f):
    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

@performance
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

输出结果:
call factorial() in 0.000336s
3628800

带参数的decorator
import time

def performance(unit):
    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
        


@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

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

posted on 2015-10-05 19:53  MaxGeek  阅读(26)  评论(0)    收藏  举报