在python中链接装饰器不会给出结果



我试图理解下面的python代码中的链接装饰器。

'''
Chaining decorator example, should not work 
'''
import datetime
def getArgs(func):
def inner():
print("Doing ",func.__name__)
a = int(input("enter A :- "))
b = int(input("enter B :- "))
return func(a,b)
return inner
def logTime(func):
def inner():
print("n")
print(datetime.datetime.now())
func()
return inner
@logTime
@getArgs
def add(a,b):
return a+b
@logTime
@getArgs
def minus(a,b):
return a-b
print(add())
print(minus())

我得到的输出是:-

2022-04-22 00:53:08.067977
Doing  add
enter A :- 1
enter B :- 1
None <----------- why None ?

2022-04-22 00:53:08.807530
Doing  minus
enter A :- 1
enter B :- 1
None <----------- why None ?

为什么输出为"无"?我在logTime's inner中尝试了return func(),我可以得到正确的输出。

我想了解的是为什么logTime's inner需要return

装饰器只是语法糖,它所做的只是add = getArgs(add),它返回inner()函数对象。然后通过调用add()调用inner(),如果它没有返回,那么结果显然是None

您可能认为链接执行不同操作,但不是,它只是执行相同的操作

add = getArgs(add)  # will return inner() of getArgs
add = logTime(add)  # will return inner() of logTime

现在,当你调用add()时,它调用logTimeinner()inner()调用getArgsinner()inner()调用初始add()。没有魔法

最新更新