Python装饰器中保留被装饰函数元数据的方法

沿途有光
沿途有光
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍如何在Python装饰器中保留被装饰函数的元数据。通过示例展示使用functools模块中的wraps装饰器和update_wrapper函数,确保原函数的__name__、__doc__等属性不被覆盖,从而保持代码的可读性和调试便利性。

本文提供Python中为被装饰函数保留元数据的具体实现代码,供读者参考学习。

具体案例如下:

函数对象内部存储了多项元数据信息,例如:

f.__name__ 表示函数名称

f.__doc__ 表示函数的文档字符串

f.__module__ 表示函数所属的模块名

f.__dict__ 表示函数的属性字典

f.__defaults__ 表示默认参数元组

              ……

当应用装饰器后,若直接访问上述属性,获取到的将是装饰器函数自身的元数据,而非原函数的信息。

核心需求:

在装饰器内部实现机制中,完整保留被装饰函数的原始元数据。

具体实现方案:

利用functools模块提供的wraps装饰器或update_wrapper函数即可达成,二者均可独立使用。

#!/usr/bin/python3
 
import time
from functools import (wraps, update_wrapper, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
 
 
def count_time(func):
  """
  给目标函数加上计算运行时间统计
  """
  # 这个装上器和update_wrapper一样,默认参数WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  @wraps(func)
  def wrapper(*args, **kwargs):
    start_time = time.time()
     
    # 定义result接收函数返回值,并且在装饰函数最后返回回去
    resutl = func(*args, **kwargs)
    print('运行时间:', time.time()-start_time)
    return resutl
   
  # 其中默认参数 WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  # update_wrapper(wrapper, func)
  return wrapper
 
 
@count_time
def add(num=100):
  """
  计算 0~num 累加值,默认num=100
  """
  time.sleep(1)
  return sum([x for x in range(num+1)])
 
if __name__ == '__main__':
  print('函数名:', add.__name__)
  print('属性字典:', add.__dict__)
  print('函数默认参数:', add.__defaults__)
  print('函数所在模块:', add.__module__)
  print('函数文档:', add.__doc__)
   
  # 打印两个默认参数
  print(WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
  result = add()
  print(result)

以上即为Python中通过装饰器保留被装饰函数元数据的全部内容,希望能为读者的编程实践带来帮助,欢迎继续支持本站获取更多技术分享。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表