参数化装饰器
解析源码中的装饰器时,Python 把被装饰的函数作为第一个参数传给装 饰器函数。那怎么让装饰器接受其他参数呢?答案是:创建一个装饰器 工厂函数,把参数传给它,返回一个装饰器,然后再把它应用到要装饰 的函数上。不明白什么意思?当然。下面以我们见过的最简单的装饰器 为例说明:
registry = set() ➊ def register(active=True): ➋ def decorate(func): ➌ print('running register(active=%s)->decorate(%s)'% (active, func)) if active: ➍ registry.add(func) else: registry.discard(func) ➎ return func ➏ return decorate ➐
@register(active=False) ➑ def f1(): print('running f1()')
@register() ➒ def f2(): print('running f2()')
def f3(): print('running f3()')
>>> import registration_param running register(active=False)->decorate(<function f1 at 0x10063c1e0>) running register(active=True)->decorate(<function f2 at 0x10063c268>) >>> registration_param.registry {<function f2 at 0x10063c268>}
人生就是要不断折腾