@wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它
@wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它
我们在上一篇文章(Python实例来认识并发与并行)中用到了 @timer ,在函数定义时,加上一个小小的 @timer ,这样,函数执行结束后,就会自动在控制台汇报自己运行的时间。
比如下面这样:
@timer
def piper():
for i in range(10000):
i = i * i ** 10
piper()
输出:
timer: using 0.00600 s
实际上,这个计时器逻辑 @timer 是我们自己用 Python 中的修饰器特性来实现的。
拆解逻辑
其实我们不用修饰器,自己也能实现计时的逻辑。
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 。
还用我们的 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__ 等用法。期待以后我遇到好的应用场景,将经验分享给朋友们。
记得点个『在看』!

我是小拍,关注我!
@wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它的更多相关文章
- Python版本OpenCV安装配置及简单实例
# 2018-06-03 # 1. Python下载:https://www.python.org/downloads/ 选择对应平台对应版本的的Python进行安装. 2. Python版OpenC ...
- 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)
[博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...
- python修饰器(装饰器)以及wraps
Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器的引入 初期及问题的诞生 假如现在在一个公司,有A B C三个业务部门,还有S一 ...
- Python修饰器的函数式编程
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...
- Python修饰器
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...
- Python修饰器的函数式编程(转)
From:http://coolshell.cn/articles/11265.html 作者:陈皓 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Desi ...
- python 修饰器 最好的讲解
Python的修饰器的英文名叫Decorator,修饰器就是对一个已有的模块做一些“修饰工作”,比如在现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能 ...
- python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
- es7之修饰器
什么是修饰器 修饰器其实就是一个普通的函数,用来修饰类以及类的方法. 比如: @test class DecoratorTest { } function test(target) { target. ...
- wraps装饰器的作用
装饰器的本质是一个闭包函数,作用在于不改变原函数功能和调用方法的基础上给它添加额外的功能.装饰器在装饰一个函数时,原函数就成了一个新的函数,也就是说其属性会发生变化,所以为了不改变原函数的属性,我们会 ...
随机推荐
- go:极简上手使用 stretchr/testify 进行mock测试
库安装 首先,安装 Mock 类生成工具 Mockery: go install github.com/vektra/mockery/v2@v2.45.1 实际上,你也可以手动创建 Mock 类. 生 ...
- Awesome Tools,程序员常用高效实用工具、软件资源精选,办公效率提升利器!
前言 在当今这个技术日新月异的时代,开发者只有持续学习,才能紧跟时代的浪潮.为了助力开发者在高效学习与工作中实现平衡(告别996的束缚),众多卓越且实用的开发工具应运而生,它们如同强大的助力器,极大地 ...
- RAC环境中某数据文件(非system表空间)创建在本地,不停机迁移到ASM磁盘中
Datafiles are mistakenly built into the local file system for processing in the RAC environment The ...
- redis的主从复制master/slaver
什么是Redis的复制 就是我们常说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主. 复制原理 Slave启动成 ...
- dorado动态修改数据验证
view.get("#userDS.dataType").getPropertyDef("unitType").set("required" ...
- 去除tinymce中粘贴的样式
import "tinymce/plugins/paste"; tinymce.init({ ...其他配置, plugins: ["paste"], past ...
- Android Hybird架构之整合XwalkView,让你的App内置chromium内核
使用XwalkView的目的无非是为了提升Android4.4以下版本(非chromium内核)的Html5渲染性能,并且能够使得H5页面在众多定制化的ROM上拥有一致的体验. 当然了,App内置Ch ...
- 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计
Air780E是合宙低功耗4G-Cat.1模组经典型号之一,上期我们解答了大家关心的系列问题,并讲解了选型的注意要点. 有朋友问:能不能讲些硬件设计相关的内容? 模组的上电开机,是硬件设计调试的第 ...
- 贴代码框架PasteForm特性介绍之markdown和richtext
简介 PasteForm是贴代码推出的 "新一代CRUD" ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代 ...
- json数据按照某一个相同键值进行分类成一个新的二维json数组
1 formatTreeData(checkNodes){ 2 var map = {}, 3 targetData = []; 4 checkNodes.forEach(item => { 5 ...