将一个装饰器列表应用于可调用的?

Phi*_*ham 4 python decorator

给定一个装饰器方法列表,如何将它们应用于可调用方法?

例如,因为:

@foo
@bar
def baz():
    pass
Run Code Online (Sandbox Code Playgroud)

...是相同的:

def baz():
    pass
baz = foo(bar(baz)))
Run Code Online (Sandbox Code Playgroud)

...人们会认为,通过装饰符列表([foo, bar]),它们可以baz动态应用.

aar*_*ing 12

还有另一个装饰者!

def yad(decorators):
    def decorator(f):
        for d in reversed(decorators):
            f = d(f)
        return f
    return decorator
Run Code Online (Sandbox Code Playgroud)

示例用法

 list_of_decorators = [foo, bar]

@yad(list_of_decorators)
def foo():
    print 'foo'
Run Code Online (Sandbox Code Playgroud)

没有装饰器语法,它看起来像

 func = yad(list_of_decorators)(func)
Run Code Online (Sandbox Code Playgroud)

如果要将同一列表应用于多个函数,可以这样做:

 dec = yad(list_of_decorators)

 func1 = dec(func1)

 @dec
 def func2():
     pass
Run Code Online (Sandbox Code Playgroud)

正如评论中的递归指出,你可以定义yad(我确定有一个更好的名称)接受*decorators而不是decorators.如果您在原地创建列表,则不必使用括号.如果列表是在其他地方创建的,我演示的方式会更好.

  • 如果用这个定义yad:`def yad(*decorators):`,那么你可以避免列表括号. (3认同)