参数化,注册装饰器


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)

原文地址:https://www.cnblogs.com/Erick-L/p/8336646.html