一个参数化的注册装饰器


        为了便于启用或禁用 register 执行的函数注册功能,我们为它提供一个可选的 active 参数,设为 False 时,不注册被装饰的函数。 从概念上看,这个新的 register 函数不是装饰器,而是装饰器工厂函数。调用它会返回真正的装饰器,这才是应用到目标函数上的装饰器。


为了接受参数,新的 register 装饰器必须作为函数调用
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()')


        registry 现在是一个 set 对象,这样添加和删除函数的速度更快。register 接受一个可选的关键字参数。decorate 这个内部函数是真正的装饰器;注意,它的参数是一个函数。只有 active 参数的值(从闭包中获取)是 True 时才注册 func。如果 active 不为真,而且 func 在 registry 中,那么把它删除。decorate 是装饰器,必须返回一个函数。register 是装饰器工厂函数,因此返回 decorate。@register 工厂函数必须作为函数调用,并且传入所需的参数。即使不传入参数,register 也必须作为函数调用(@register()),即要返回真正的装饰器 decorate。这里的关键是,register() 要返回 decorate,然后把它应用到被装饰的函数上。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页