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并尝试理解装饰器如何适用于这两个例子。
我想知道流程是如何工作的。我知道@logger
与add = 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))
哪个不行。结合它的目的是让我能更好地理解例子。
答案 0 :(得分:1)
你正试图装饰' add()
函数调用的返回值,而不是add
函数本身。
适当的等价物是使用:
logger(add)(1, 2)
所以使用logger()
的返回值作为传递1, 2
参数的函数。
换句话说,您需要替换正确的呼叫。如果您为装饰器调用的结果使用了不同的名称,则可能更容易理解:
decorated = logger(add)
decorated(1, 2)
然后只需将decorated
替换为原始logger(add)
来电:
logger(add)(1, 2)