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

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

任何时候你定义装饰器的时候,都应该使用 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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容