Python 中实现装饰器 @functools.wraps 的做用

废话不说,先看两端代码:app

一、使用了@functools.wraps函数

import time
import functools

def timeit(func):
   @functools.wraps(func)
   def wrapper():
      start = time.clock()
      func()
      end =time.clock()
      print "used:", end - start
   return wrapper

@timeit
def foo():
   print "in foo()"

foo()
print "foo name", foo.__name__

运行结果(foo name 是自身foo):blog

二、未使用@functools.wraps源码

import time
#import functools

def timeit(func):
   #@functools.wraps(func)
   def wrapper():
      start = time.clock()
      func()
      end =time.clock()
      print "used:", end - start
   return wrapper

@timeit
def foo():
   print "in foo()"

foo()
print "foo name", foo.__name__

运行结果(foo name 是wrapper):it

总结:因而可知,在编写装饰器时,在实现前加入@functools.wraps(func) 能够保证装饰器不会对被装饰函数形成影响。import

具体原理,及更详细的内容还有待看functool源码去了解。原理

相关文章
相关标签/搜索