带参数的decorator

 

本文是对浅析decorator一文做的一点补充。
国际惯例,先上代码:

from functools import wraps

def log(text):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kw):
            print('%s call %s()' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator


@log('execute')
def f():
    pass

执行:

print(f())

输出:

execute call f()
None

没有参数的decorator相比,我们发现,在装饰器函数的内部又多定义了一个高级函数,在此例中具体指的是def decorator(func):这个函数。
那么如何理解呢?
我的理解是这样的:
最外层的装饰器函数def log(text):用来接收我们要传入的参数'execute',那么我们要改造的旧函数def f():就需要另一个函数来接收,这就是多写一个高级函数def decorator(func):的意义所在。

OK,就是这么短!