我怎么能把几个装修工装成一个?

2024-05-12 21:03:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在每个函数上都有几个装饰器,有没有办法把它们组合成一个?在

@fun1
@fun2
@fun3
def do_stuf():
    pass

更改为:

^{pr2}$

Tags: 函数def装饰passdo办法stufpr2
3条回答

还可以编写一个支持decorator链接的泛型decorator:

def fun1(f):
    print "fun1"
    return f

def fun2(f):
    print "fun2"
    return f

def fun3(f):
    print "fun3"
    return f

def chained(*dec_funs):
    def _inner_chain(f):
        for dec in reversed(dec_funs):
            f = dec(f)
        return f

   return _inner_chain

@fun1
@fun2
@fun3
def do_stuff():
    pass

@chained(fun1, fun2, fun3)
def do_stuff2():
    pass

all_funs = chained(fun1, fun2, fun3)

@all_funs
def do_stuff3():
    pass
def all_funs(f):
    return fun1(fun2(fun3(f)))

原则上,修饰语只是语法上的甜点:

def do_stuf():
    pass

do_stuf = fun1(do_stuf)

所有的装饰者都应该这样做:

^{pr2}$

如果有装饰器的参数,事情会变得更复杂一点(但只有一点点)。在

相关问题 更多 >