目的是当同一个装饰器应用到多个原始的函数时,恰恰原始的函数里面的形参数量又不一样多,如果有个没有行参,有的有一个,有的有多个。通过*args,**kwargs就可以满足所有原始的函数。
1 import time
2
3 def timer(func):
4 #def deco(): #part1
5 #def deco(arg1): #part2
6 def deco(*args,**kwargs): #part3
7 start_time=time.time()
8 #func() #part1
9 #func(arg1) #part2, 这里带了参数会影响到test1(),因为test1()里面没有参数
10 func(*args,**kwargs) #part3,test1()没有参数不影响,*args可以匹配空参数
11 stop_time=time.time()
12 print('the time of the function running is %s'%(stop_time-start_time))
13 return deco
14
15 @timer
16 def test1():
17 time.sleep(1)
18 print('this is test1')
19
20 @timer
21 def test2(name): #给test2加一个形参, test2=timer(test2)=func, test2里面有参数,func应该也要加参数
22 time.sleep(1)
23 print('this is test2',name)
24
25 #test1() #part2
26 test1() #part1, part3
27 test2('alex') #从错误可以看到test2()=deco() test2给了实参,deco()里面也必须要给个参数
28 #TypeError: deco() takes 0 positional arguments but 1 was given
29
30 #part3结果
31 # this is test1
32 # the time of the function running is 1.0000574588775635
33 # this is test2 alex
34 # the time of the function running is 1.0000569820404053