我正在尝试编写一个装饰器,它将任意数量的函数作为位置参数,然后将这些函数与正在装饰的函数组合在一起。
从概念上讲,我正在尝试这样做:
@format(f1, f2, f3)
def f0(param):
return value
f0(arg)
应评估为f3(f2(f1(f0(arg))))
这是一个我一直在努力说明这个概念的简单例子。
def lc(s):
s = s.lower()
return s
def punc(s):
if s[-1] != ".":
s = s + "."
return s
else:
return s
def cap(s):
s = s[0].upper() + s[1:]
return s
def format(*args):
def wrapper(func, *a):
for f in args:
func = f(func)
return func
return wrapper
@format(lc, punc, cap)
def example_func(param):
return param
我期待的是:
f0("MY TEST STRING")
My test string.
我收到以下错误消息:
AttributeError: 'function' object has no attribute 'lower'
可能有一种更简单的方法,例如将函数直接传递给原始函数而不使用装饰器,但我正在寻找一种专门使用装饰器的解决方案。谢谢。
答案 0 :(得分:2)
你需要使用" decorator-with arguments"模式,所以像这样:
def format(*fs):
def deco(f):
def wrapper(x):
val = f(x)
for func in fs:
val = func(val)
return val
return wrapper
return deco