Python 以任意数量的函数作为参数的装饰器和 returns 函数的组合
Python decorator that takes arbitrary number of functions as arguments and returns composition of functions
我正在尝试编写一个装饰器,它将任意数量的函数作为位置参数,然后将这些函数与被装饰的函数组合在一起。
从概念上讲,我正在尝试这样做:
@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'
可能有更简单的方法可以做到这一点,比如直接将函数传递给原始函数而不使用装饰器,但我正在寻找一种专门通过这种方式使用装饰器的解决方案。谢谢。
您需要使用 "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
我正在尝试编写一个装饰器,它将任意数量的函数作为位置参数,然后将这些函数与被装饰的函数组合在一起。
从概念上讲,我正在尝试这样做:
@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'
可能有更简单的方法可以做到这一点,比如直接将函数传递给原始函数而不使用装饰器,但我正在寻找一种专门通过这种方式使用装饰器的解决方案。谢谢。
您需要使用 "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