为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要用三层嵌套函数?不可以直接用performance装饰f吗?像这样performance(f)不行?

import time
def performance(unit):
   def perf_decorator(f):
       def wrapper(*args, **kw):
           t1 = time.time()
           r = f(*args, **kw)
           t2 = time.time()
           t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
           print 'call %s() in %f %s' % (f.__name__, t, unit)
           return r
       return wrapper
   return perf_decorator

@performance('ms')
def factorial(n):
   return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

正在回答

3 回答

这个装饰用途在于:已经有了一份代码的前提下,代码中有多处调用了a()方法。

现在想在调用a()方法的时候,全部新增一些操作,如打印一句话,用装饰方法只要写一个新函数b(),并在原函数中头上加个@b即可,原代码中调用a()方法的地方,都会自动替换成执行新函数。

按题主的想法,应该怎么做呢?首先新增一个b()方法,然后在代码中所有调用了a()的地方全部一一修改成b(),显然增加了工作量,而且代码多时,修改容易出错。

0 回复 有任何疑惑可以回复我~

这个就如例子@log("debug")或@log("info")是一样的, 如果直接@log(f)的话就不能传入debug或是info了,这个@performance(unit)也是一样的道理,细细体会吧。

2 回复 有任何疑惑可以回复我~

直接performance(f)的话,就不能传进参数'ms'了

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

为什么要用三层嵌套函数?不可以直接用performance装饰f吗?像这样performance(f)不行?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信