簡體   English   中英

使用任意數量的函數作為參數並返回函數組成的Python裝飾器

[英]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'

可能有一種更簡單的方法來執行此操作,例如將函數直接傳遞到原始函數中而不使用裝飾器,但是我正在尋找一種以這種方式專門使用裝飾器的解決方案。 謝謝。

您需要使用“帶有參數的裝飾器”模式,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM