代码之家  ›  专栏  ›  技术社区  ›  Phillip B Oldham

对可调用的应用装饰器列表?

  •  4
  • Phillip B Oldham  · 技术社区  · 14 年前

    例如,因为:

    @foo
    @bar
    def baz():
        pass
    

    ……与:

    def baz():
        pass
    baz = foo(bar(baz)))
    

    [foo, bar] )它们可以应用于 baz

    2 回复  |  直到 14 年前
        1
  •  12
  •   aaronasterling    14 年前

    还有一个装饰师!

    def yad(decorators):
        def decorator(f):
            for d in reversed(decorators):
                f = d(f)
            return f
        return decorator
    

    示例用法

     list_of_decorators = [foo, bar]
    
    @yad(list_of_decorators)
    def foo():
        print 'foo'
    

    如果没有decorator语法,它看起来就像

     func = yad(list_of_decorators)(func)
    

     dec = yad(list_of_decorators)
    
     func1 = dec(func1)
    
     @dec
     def func2():
         pass
    

    正如注释中递归指出的,您可以定义 yad *decorators 而不是 decorators . 如果要创建列表,则不必使用括号 原地 . 如果列表是在其他地方创建的,我演示的方式会更好。

        2
  •  2
  •   pillmuncher    14 年前

    有史以来最经典的:

    def compose(f, g):
        def composed(*a, **k):
            return g(f(*a, **k))
        return composed
    
    @compose(foo, compose(bar, baz))
    def blam():
        pass