Python自动化装饰器问题解疑

时间:2021-12-31 16:22:27

问题一 到底是怎么执行的?

import time

def timer(timeout=0):
def decorator(func):
def wrapper(*args, **kwargs): # 会给装饰器传递参数,因为无法确定装饰器有多少参数,所以使用这个。
start = time.time()
func(*args, **kwargs)
stop = time.time()
print('run time is %s ' % (stop - start))
print(timeout) return wrapper return decorator @timer(2) # 装饰器的参数为2 timer(2)(test)
def test(list_test):
for i in list_test:
time.sleep(0.1)
print('-' * 20, i) # timer(timeout=10)(test)(range(10))
test(range(2))

@timer(2) 等价于 test = timer(2)(test)

执行过程为:

①执行timer(2)返回decorator这个函数对象

②实际上是decorator(test)返回wrapper函数对象并赋给test,等价于test=wrapper

最后执行test(range(2))相当于wrapper(test2)

问题二嵌套函数必须这么写吗?

装饰器的作用就是在函数调用方法不变的情况下,把此函数包装成另一个函数来使用。

去掉任何一个嵌套函数都会改变函数的调用方式。