Discuss / Python / 对于装饰器的理解&练习答案

对于装饰器的理解&练习答案

Topic source

松鼠Yanis

#1 Created at ... [Delete] [Delete and Lock User]

首先引用原文中的一段话:

@log放到now()函数的定义处,相当于执行了语句:

now = log(now)

做完练习之后再回顾这段话突然茅塞顿开

之前看到其他同学练习答案如下

import time

import functools

def metric(fn):

    @functools.wraps(fn)

    def wrapper(*args,**kw):

        start=time.time()

        re=fn(*args,**kw)

        end=time.time()

        print('%s() excute in %s s'%(fn.__name__,end-start))

        return re

    return wrapper

一开始纠结了很久,之前的例子里wrapper函数的返回值都是fn,为什么最后是返回re而不是返回fn。实际上,因为这里需要计算fn的运行时间,所以先用re=fn(*args,**kw)将fn运行了一遍,可以直接将re作为返回值。在这里,return re和return fn(*args,**kw),其实都是在wrapper里将fn运行了一遍。

松鼠Yanis

#2 Created at ... [Delete] [Delete and Lock User]

还发现一个问题,如果这里用return fn(*args,**kw),相当于在re=fn(*args,**kw)时运行了一次fn,返回值的时候又运行了一次。

如果fn只是计算得到数值,对于整个程序并没有影响,但如果fn内部有print(xxxx)语句,那两次执行都会print,最终结果会受到影响。

你确定你打印了吗?


  • 1

Reply