python进阶(18)@wraps装饰器

编程入门 行业动态 更新时间:2024-10-07 18:26:32

python<a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶(18)@wraps装饰器"/>

python进阶(18)@wraps装饰器

前言

我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下

案例

import timedef run_time(func):def wrapper(*args, **kwargs):"""时间装饰器"""time1 = time.time()func(*args, **kwargs)time2 = time.time()cost_time = time2 - time1return f"函数花了{cost_time}秒"return wrapper@run_time
def test():"""测试"""print([i for i in range(1, 100001) if i % 200 == 0])if __name__ == '__main__':print(test.__name__)   print(test.__doc__)  
"""
结果
# wrapper
# 时间装饰器
"""

可以看到,我们明明打印的是test函数的__name__属性,最后显示的却是run_time的属性。
我们知道@run_time装饰器实际上就等于test = run_time(test),此时我们打印test.__name__实际上test已经指向了wrapper,这样会造成我们打印的时候会打印装饰器的内嵌函数的名字和注释。

使用wraps装饰器解决

wraps可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module____name____doc____qualname____annotations__或者通过参数选择

import time
from functools import wrapsdef run_time(func):@wraps(func)def wrapper(*args, **kwargs):"""时间装饰器"""time1 = time.time()func(*args, **kwargs)time2 = time.time()cost_time = time2 - time1return f"函数花了{cost_time}秒"return wrapper@run_time
def test():"""测试"""print([i for i in range(1, 100001) if i % 200 == 0])if __name__ == '__main__':print(test.__name__)   print(test.__doc__) 
"""
结果:
test
测试
"""

我们就只在原来的wrapper内函数上加了一个@wraps(func)装饰器,就可以打印出我们想要的结果了,这是因为wraps可以将原函数对象的指定属性复制给包装函数对象,我们可以查看它的源码

def wraps(wrapped,assigned = WRAPPER_ASSIGNMENTS,updated = WRAPPER_UPDATES):"""Decorator factory to apply update_wrapper() to a wrapper functionReturns a decorator that invokes update_wrapper() with the decoratedfunction as the wrapper argument and the arguments to wraps() as theremaining arguments. Default arguments are as for update_wrapper().This is a convenience function to simplify applying partial() toupdate_wrapper()."""return partial(update_wrapper, wrapped=wrapped,assigned=assigned, updated=updated)

更多推荐

python进阶(18)@wraps装饰器

本文发布于:2024-02-06 13:14:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1748849.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   python   wraps

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!