Python自动化装饰器问题解疑

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

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)

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

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

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

原文地址:https://www.cnblogs.com/wspblog/p/6030050.html