本文介绍了装饰设计师:尽我所能理解它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我试图了解装饰装饰器,并想尝试以下方法:
I'm trying to understand decorating decorators, and wanted to try out the following:
假设我有两个装饰器并将它们应用于函数hello:
Let's say I have two decorators and apply them to the function hello:
def wrap(f):
def wrapper():
return " ".join(f())
return wrapper
def upper(f):
def uppercase(*args, **kargs):
a,b = f(*args, **kargs)
return a.upper(), b.upper()
return uppercase
@wrap
@upper
def hello():
return "hello","world"
print hello()
然后我必须开始为其他功能添加其他装饰器,
,但通常包装装饰器将包装所有装饰器
Then I have to start adding other decorators for other functions,but in general the wrap decorator will "wrap all of them"
def lower(f):
def lowercase(*args, **kargs):
a,b = f(*args, **kargs)
return a.lower(), b.lower()
return lowercase
@wrap
@lower
def byebye():
return "bye", "bye"
现在我要如何用巫婆写一个装饰器,我可以装饰我的上下装饰器:
Now how do I write a decorator, with witch I can decorate my lower and upper decorators:
@wrap
def lower():
...
@wrap
def upper():
...
要实现通过执行以下操作获得与上述相同的结果:
To achieve the same result as above by only doing:
@upper
def hello():
...
@lower
def byebye():
...
推荐答案
这是一种使用装饰器装饰装饰器的通用(略为复杂)解决方案(是!)。
Here's a generic (and slightly convoluted) solution for decorating decorators with decorators (Yay!).
# A second-order decorator
def decdec(inner_dec):
def ddmain(outer_dec):
def decwrapper(f):
wrapped = inner_dec(outer_dec(f))
def fwrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
return fwrapper
return decwrapper
return ddmain
def wrap(f):
def wrapper():
return " ".join(f())
return wrapper
# Decorate upper (a decorator) with wrap (another decorator)
@decdec(wrap)
def upper(f):
def uppercase(*args, **kargs):
a,b = f(*args, **kargs)
return a.upper(), b.upper()
return uppercase
@upper
def hello():
return "hello","world"
print hello()
这篇关于装饰设计师:尽我所能理解它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!