给定一个装饰器方法列表,如何将它们应用于可调用方法?
例如,因为:
@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.如果您在原地创建列表,则不必使用括号.如果列表是在其他地方创建的,我演示的方式会更好.
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |