您现在的位置是:亿华云 > 应用开发
@wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它
亿华云2025-10-02 22:02:28【应用开发】0人已围观
简介我们在上一篇文章(Python实例来认识并发与并行)中用到了 @timer ,在函数定义时,加上一个小小的 @timer ,这样,函数执行结束后,就会自动在控制台汇报自己运行的时间。比如下面这样:@t
我们在上一篇文章(Python实例来认识并发与并行)中用到了 @timer ,饰器识在函数定义时,代码单实加上一个小小的更加 @timer ,这样,简短函数执行结束后,可爱就会自动在控制台汇报自己运行的从简时间。
比如下面这样:
@timer def piper(): for i in range(10000): i = i * i ** 10 piper() 输出: timer: using 0.00600 s实际上,饰器识这个计时器逻辑 @timer 是代码单实我们自己用 Python 中的修饰器特性[1]来实现的。
拆解逻辑
其实我们不用修饰器,更加自己也能实现计时的简短逻辑。
def piper(): for i in range(10000): i = i * i ** 10 t = time.time() # 记录函数开始时时间 piper() print(f"timer: using { time.time() - t :.5f} s") # 获取函数运行时间并打印注意到我们执行函数时,可爱在其上下都包裹上了逻辑。从简如果我们希望函数自带计时逻辑,云服务器提供商饰器识那么为了包住原函数,代码单实只能去新定义一个函数。更加
def time_wrapper(func): # func 是一个函数 t = time.time() func() print(f"timer: using { time.time() - t :.5f} s") time_wrapper(piper) 输出: timer: using 0.00600 s我们想测试某一个函数运行时间时,将函数名输入到 time_wrapper 里面就好。
更优雅的改进
上述代码显然有缺点:
我们在编程时,心智负担增大了;此外,代码更冗长了 如果我们只是希望函数新增一个功能,显然用 time_wrapper 是不行的,因为其并没有改变 piper 本身于是我们请出今天的主角 修饰器@wraps[2] 。
还用我们的 timer 举例子,亿华云计算我们让所有在 @timer 下的函数,都经过如下处理:
def timer(func): @wraps(func) def inner_func(): t = time.time() rts = func() print(f"timer: using { time.time() - t :.5f} s") return rts return inner_func以 piper 为例,我们经历了如下变化。
@timer def 原始piper(): for i in range(10000): i = i * i ** 10实际上,当你再调用 piper 时,你的 piper 内部逻辑早已变为:
def 当前piper(): t = time.time() rts = 原始piper() print(f"timer: using { time.time() - t :.5f} s") return rts总结
本文简单与读者朋友们「科普」一下修饰器,注意到我们这里实际上仅仅修饰了无参数的函数。其实,修饰器还有许多更加优雅用途,比如传入参数 *args, **kwargs ,修饰类 __call__ 等用法。期待以后我遇到好的应用场景,将经验分享给朋友们。
亿华云很赞哦!(25)
上一篇: 在全球变暖之际,数据中心如何保持冷却
下一篇: 数据中心的停机时间怎么会成为企业的噩梦?
相关文章
- 西部数据立足HDD革新,助力企业制胜可持续数字化未来
- 公司在注册域名时还需要确保邮箱的安全性。如果邮箱不安全,它只会受到攻击。攻击者可以直接在邮箱中重置密码并攻击用户。因此,有必要注意邮箱的安全性。
- 域名和网址一样吗?域名和网址有什么区别?
- 公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
- 激扬创新动能,掘金数字时代|2022年第十七届中国企业年终评选榜单揭晓
- 小白注册网站域名该怎么办?有什么步骤?
- 为啥修改dns服务器?dns服务器与域名有何联系?
- 换新域名(重新来过)
- 昇腾AI助力长三角人工智能产业发展!上海人工智能生态赋能中心正式成立,迎首批伙伴入驻
- 为啥修改dns服务器?dns服务器与域名有何联系?