装饰设计师:尽我所能理解它 [英] decorating decorators: try to get my head around understanding it

查看:57
本文介绍了装饰设计师:尽我所能理解它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图了解装饰装饰器,并想尝试以下方法:

I'm trying to understand decorating decorators, and wanted to try out the following:

假设我有两个装饰器并将它们应用于函数hello:

Let's say I have two decorators and apply them to the function hello:

def wrap(f):
    def wrapper():
        return " ".join(f())
    return wrapper


def upper(f):
    def uppercase(*args, **kargs):
        a,b = f(*args, **kargs)
        return a.upper(), b.upper()
    return uppercase

@wrap
@upper
def hello():
    return "hello","world"

print hello()

然后我必须开始为其他功能添加其他装饰器,
,但通常包装装饰器将包装所有装饰器

Then I have to start adding other decorators for other functions, but in general the wrap decorator will "wrap all of them"

def lower(f):
    def lowercase(*args, **kargs):
        a,b = f(*args, **kargs)
        return a.lower(), b.lower()
    return lowercase

@wrap
@lower
def byebye():
    return "bye", "bye"

现在我要如何用巫婆写一个装饰器,我可以装饰我的上下装饰器:

Now how do I write a decorator, with witch I can decorate my lower and upper decorators:

@wrap
def lower():
    ...

@wrap
def upper():
    ...

要实现通过执行以下操作获得与上述相同的结果:

To achieve the same result as above by only doing:

@upper
def hello():
    ...

@lower
def byebye():
    ...


推荐答案

这是一种使用装饰器装饰装饰器的通用(略为复杂)解决方案(是!)。

Here's a generic (and slightly convoluted) solution for decorating decorators with decorators (Yay!).

# A second-order decorator
def decdec(inner_dec):
    def ddmain(outer_dec):
        def decwrapper(f):
            wrapped = inner_dec(outer_dec(f))
            def fwrapper(*args, **kwargs):
               return wrapped(*args, **kwargs)
            return fwrapper
        return decwrapper
    return ddmain

def wrap(f):
    def wrapper():
        return " ".join(f())
    return wrapper


# Decorate upper (a decorator) with wrap (another decorator)
@decdec(wrap)
def upper(f):
    def uppercase(*args, **kargs):
        a,b = f(*args, **kargs)
        return a.upper(), b.upper()
    return uppercase

@upper
def hello():
    return "hello","world"

print hello()

这篇关于装饰设计师:尽我所能理解它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆