zoukankan      html  css  js  c++  java
  • 参数化,注册装饰器


    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)

  • 相关阅读:
    【安徽集训】fiend
    【安徽集训】Emerald
    【安徽集训】Entropy
    【安徽集训】字符串
    【福建集训】果树
    【CF335 E】Counting Skyscrapers
    【BZOJ 3514】Codechef MARCH14 GERALD07 加强版
    【未知来源】Randomized Binary Search Tree
    【ZJOI 2016】旅行者
    【AGC002 E】Candy Piles
  • 原文地址:https://www.cnblogs.com/Erick-L/p/8336646.html
Copyright © 2011-2022 走看看