关于装饰器括号问题
2020-04-16 本文已影响0人
running_sheep
今天正好看到一个三层装饰器,显示方式是:@decorate(),但我记得两层的时候明明是不加括号的@decorate。有点不明白,就写了一个函数计时器的装饰器,测试一下。
两层的时候,加了()是会报错的,因为没给参数,如下:
那什么时候既可以加()又可以不加()呢,需要加一个判断,如下:
这说明,如果是@time_log(),那么传入的func=None,return wrapper,func就是@time_log()下面的myfunc;如果是@time_log,那么传入的func就是下面的myfunc,那么检查myfunc是否可调用,如果可以,return wrapper(myfunc)