创建装饰器时保留函数元信息

2019-02-19  本文已影响0人  noteby

场景:你写了一个装饰器作用在某个函数上,但是这个函数的重要的元信息比如名字、文档字符串、注解和参数签名都丢失了

任何时候你定义装饰器的时候,都应该使用 functools 库中的 @wraps 装饰器来注解底层包装函数

  import time
  from functools import wraps
  def cal_time(func):
      '''
      Decorator that reports the execution time.
      '''
      @wraps(func)
      def wrapper(*args, **kwargs):
          start = time.time()
          result = func(*args, **kwargs)
          end = time.time()
          print(func.__name__, end-start)
          return result
      return wrapper
      
  @cal_time
  def func(n:int):
      for _ in range(n):
          pass
 
  func()

@wraps 有一个重要特征是它能让你通过属性 wrapped 直接访问被包装函数

  func.__wrapped__(3)
上一篇 下一篇

猜你喜欢

热点阅读