functools.wraps定义函数装饰器

  
 <代码> def示踪(函数):
  def包装器(* args, * * kwargs):
  结果=func (* args, * * kwargs)
  打印(' % s r (r %, %)→% r ' % (func.__name__, args, kwargs,结果))
  返回结果
  返回包装
  
  @tracer
  def斐波纳契(n):
  如果n (0, 1):
  返回n
  返回(斐波纳契(n - 1) +斐波纳契(n - 2))
  
  斐波纳契(3)
  打印(斐波那契)
  print('帮助:')
  帮助(斐波那契) 
  

从执行结果看到:最后的函数对象,变成了包装,而并非斐波那契函数对象。
因fibonacchi函数在装饰器后,包装对象赋值给了斐波那契函数对象,即fibnacchi=包装。

  

functools.wraps的使用:

  

也就是说,原函数的属性失效了
如果想要保留原函数的属性,就可以用到functools.wraps了

  
 <代码>从functools进口包装
  def示踪(函数):
  @wraps(函数)
  def包装器(* args, * * kwargs):
  结果=func (* args, * * kwargs)
  打印(' % s r (r %, %)→% r ' % (func.__name__, args, kwargs,结果))
  返回结果
  返回包装
  
  @tracer
  def斐波纳契(n):
  如果n (0, 1):
  返回n
  返回(斐波纳契(n - 1) +斐波纳契(n - 2))
  
  斐波纳契(3)
  打印(斐波那契)
  print('帮助:')
  帮助(斐波那契) 
  

functools。包装在执行之后,重新将函数赋值给原函数:包装=fibonacchi。

functools.wraps定义函数装饰器