装饰者的流程和过程

时间:2014-12-06 16:12:48

标签: python decorator python-decorators

def logger(func):
    def inner(*args, **kwargs): #1
        print ('Arguments were: {}, {}'.format(args, kwargs))
        return func(*args, **kwargs) #2
    return inner

def add (x,y):
    return x+y

add = logger(add)
add(1, 2)

不使用@logger的代码,基本上将其替换为add = logger(add)

def logger(func):
    def inner(*args, **kwargs): #1
        print ('Arguments were: {}, {}'.format(args, kwargs))
        return func(*args, **kwargs) #2
    return inner

@logger
def add (x,y):
    return x+y

add(1, 2)

使用@logger的代码,add = logger (add)已删除。

两者都具有相同且正确的输出

我还在学习python并尝试理解装饰器如何适用于这两个例子。

我想知道流程是如何工作的。我知道@loggeradd = logger(add)相同,然后示例使用add (1,2)。这意味着add(1,2) = logger(add(1,2))

但是,如果是这种情况,为什么当我尝试logger(add(1,2))

时它不起作用

基本上我正在尝试合并

add = logger(add)
add(1,2)

类似

logger(add(1,2))

哪个不行。结合它的目的是让我能更好地理解例子。

1 个答案:

答案 0 :(得分:1)

你正试图装饰' add()函数调用的返回值,而不是add函数本身

适当的等价物是使用:

logger(add)(1, 2)

所以使用logger()的返回值作为传递1, 2参数的函数。

换句话说,您需要替换正确的呼叫。如果您为装饰器调用的结果使用了不同的名称,则可能更容易理解:

decorated = logger(add)
decorated(1, 2)

然后只需将decorated替换为原始logger(add)来电:

logger(add)(1, 2)