两个实用的Python的装饰器
超时函数
这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 、网络爬虫、数据库查询的时候特别有用
timeout装饰器的代码如下:
import signal,functools #下面会用到的两个库 class TimeoutError(Exception): pass #定义一个Exception,后面超时抛出 def timeout(seconds, error_message = 'Function call timed out'): def decorated(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(seconds) try: result = func(*args, **kwargs) finally: signal.alarm(0) return result return functools.wraps(func)(wrapper) return decorated
使用:
@timeout(5) #限定下面的slowfunc函数如果在5s内不返回就强制抛TimeoutError Exception结束 def slowfunc(sleep_time): import time time.sleep(sleep_time) #这个函数就是休眠sleep_time秒 slowfunc(3) #sleep 3秒,正常返回 没有异常 slowfunc(10) #被终止 ## 输出 --------------------------------------------------------------------------- TimeoutError Traceback (most recent call last)
Trace函数
有时候出于演示目的或者调试目的,我们需要程序运行的时候打印出每一步的运行顺序 和调用逻辑。类似写bash的时候的bash -x调试功能,然后Python解释器并没有 内置这个时分有用的功能,那么我们就“自己动手,丰衣足食”。
Trace装饰器的代码如下:
import sys,os,linecache def trace(f): def globaltrace(frame, why, arg): if why == "call": return localtrace return None def localtrace(frame, why, arg): if why == "line": # record the file name and line number of every trace filename = frame.f_code.co_filename lineno = frame.f_lineno bname = os.path.basename(filename) print "{}({}): {}".format( bname, lineno, linecache.getline(filename, lineno).strip('\r\n')), return localtrace def _f(*args, **kwds): sys.settrace(globaltrace) result = f(*args, **kwds) sys.settrace(None) return result return _f
使用:
@trace
def xxx():
print 1 print 22 print 333 xxx() #调用 ## 输出 <ipython-input-4-da50741ac84e>(3): print 1 # @trace 的输出 1 <ipython-input-4-da50741ac84e>(4): print 22 # @trace 的输出 22 <ipython-input-4-da50741ac84e>(5): print 333 # @trace 的输出 333
作者:auxten链接:https://zhuanlan.zhihu.com/p/20175869
两个实用的Python的装饰器相关推荐
- python装饰器函数-Python精进-装饰器与函数对象
本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...
- python turtle画气球-如何用python的装饰器定义一个像C++一样的强
如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...
- Python之装饰器
Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...
- python简单装饰器_python装饰器的简单示例
这篇文章主要为大家详细介绍了python装饰器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 装饰器的语法以 ...
- 浅谈Django的中间件与Python的装饰器
浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
- Python的装饰器
详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...
- python装饰器函数-python函数装饰器
什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...
- python装饰器函数-Python函数装饰器常见使用方法实例详解
本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...
最新文章
- 【Step By Step】将Dotnet Core部署到Docker下
- CPU和GPU跑深度学习差别有多大?
- c++设计一个不能被继承的类
- [原创] Debian9上配置Samba
- linux命令awk
- 开发工程师面试自我介绍_30道经典面试题,靠它我在一线拿到了20k的前端开发工程师岗位...
- Linux安装FTP服务-----vsftpd
- 想成功创业:要掌握“三笔钱”和“六三一”原则
- 如何创建一个Eureka Client?
- 中国豪华的政府大楼VS破学校
- python map函数返回类型_使用map和lambda函数发送两个参数并返回两个值
- 众人帮蚂蚁帮任务平台修复版源码
- 这是一个最不缺“大师”的时代
- 不敢相信?System.currentTimeMillis() 居然存在性能问题
- java doc转mht_Word文档格式doc转为mht.doc
- 河北农大计算机专业全国排名,2019河北农业大学现代科技学院专业排名
- Gary Marcus再发万字长文,列14个QA回应机器学习批判言论
- Hi3518EV300芯片linux系统配置USB Camera功能
- 我需要30部美或英剧的剧名
- tengine简单安装_阿里云tengine的安装 -- by hzw
热门文章
- python2和python3如何共存,如何安装多版本python python2和python3共存以及pip共存
- time、random以及序列化模块
- 数据库备份DBS 新增Region支持:华北2、华东2和华南1
- Spring思维导图(IOC篇)
- JavaScript模仿块级作用域
- 怎么查看Beyond Compare所有会话日志消息
- 官方宣布:谷歌开发者中国网站正式发布!
- CSS3选择器:nth-child和:nth-of-type之间的差异的那些事儿
- puppet系列之nginx+php日志切割与salt结合使用
- [游泳] Sun Yang 1500 Swimming Stroke Analysis London 2012