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

@functools.wraps(f)放置位置问题

import time, functools


def performance(unit):

      def perf_decorator(f):

           @functools.wraps(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.__name__


1、为什么@functools.wraps(f)不是放在  def perf_decorator(f):之前么??

2、经过带参数的decorator(即performance('ms'))之后factorial(n)函数的函数不是应该变成了perf_decorator么??

正在回答

2 回答

import time, functools

def performance(unit):
    def perf_ferformance(f):

        def warpper(*args,**kw):
            t1=time.time()
            r=f(*args,**kw)
            t2=time.time()
            t=(t2-t1)*1000 if unit=='ms' else (t2-t1)
            return r
        return warpper
    return perf_ferformance

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

print factorial.__name__

但是运行这段不添加@functools.wraps(f)的代码时,结果还是warpper

0 回复 有任何疑惑可以回复我~
  1. 传入f变量后才算拿到了变量,可以对其进行装饰

  2. 对,然后@performance('ms') -变-成-了-> @perf_decorator,对factorial(n)进行装饰

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

慕粉0002062090

那函数名打印为啥不会变成perf_decorator呢?带参数decorater不是外面又套了一层吗
2017-05-19 回复 有任何疑惑可以回复我~
#2

苏莫 回复 慕粉0002062090

因为def perf_decorator(f)下面定义了@functools.wraps(f),将原函数的属性复制到装饰器函数里,括号中的f就是原函数factorial,所以打印出来的不会变成perf_decorator
2017-07-11 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

@functools.wraps(f)放置位置问题

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号