我试图理解下面的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()
时,它调用logTime
的inner()
,inner()
调用getArgs
的inner()
,inner()
调用初始add()
。没有魔法