Python装饰器,它将任意数量的函数作为参数并返回函数的组合

时间:2018-01-29 23:40:39

标签: python decorator function-composition

我正在尝试编写一个装饰器,它将任意数量的函数作为位置参数,然后将这些函数与正在装饰的函数组合在一起。

从概念上讲,我正在尝试这样做:

@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'

可能有一种更简单的方法,例如将函数直接传递给原始函数而不使用装饰器,但我正在寻找一种专门使用装饰器的解决方案。谢谢。

1 个答案:

答案 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