Python装饰器中保留被装饰函数元数据的方法
本文介绍如何在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中通过装饰器保留被装饰函数元数据的全部内容,希望能为读者的编程实践带来帮助,欢迎继续支持本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









