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()') print(registry) print(register()(f3))#表达式返回decorate,然后应用在f3上 print(registry) # 已经把f3添加到registry print(register(active=False)(f2)) #删除f2 print(registry) #只有f3
参数化clock装饰器
import time DEFAULT_FMT='[{elapsed:0.8f}s] {name}({args}) -> {result}' def clock(fmt= DEFAULT_FMT): #参数化装饰器工厂函数 def decorte(func):#真正的装饰器 def clocked(*_args):#包装被装饰的函数 t0 = time.perf_counter() _result = func(*_args) # 返回 被装饰函数返回的真正结果 elapsed = time.perf_counter()- t0 name = func.__name__ args = ','.join(repr(arg) for arg in _args) result = repr(_result) print(fmt.format(**locals())) #**local为了在fmt中引用clocked的局部变量 return _result return clocked return decorte if __name__ == '__main__': @clock() def snooze(seconds): time.sleep(seconds) for i in range(3): snooze(.123)
传入格式参数
if __name__ == '__main__': @clock('{name}:{elapsed}s') def snooze(seconds): time.sleep(seconds) for i in range(3): snooze(.123)
if __name__ == '__main__': @clock('{name}({args}) dt={elapsed:0.3f}s') def snooze(seconds): time.sleep(seconds) for i in range(3): snooze(.123)