python如何修改装饰器中参数


Posted in Python onMarch 20, 2018

本文实例为大家分享了python修改装饰器中参数的具体代码,供大家参考,具体内容如下

案例:

       为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器

       需求:

统计被装饰函数的运行时间

时间大于timeout时,将此次函数调用记录到log日志中

运行时可以修改timeout的值

如何解决这个问题?

  • 定义一个装饰器,计算函数执行时间,并与timeout比较,当大于timeout时候,通过logging模块打印出日志信息
  • 在包裹函数中添加一个函数,通过这个函数来修改timeout变量
  • 在python3中用nonlocal来声明嵌套作用域中的变量引用,在python2中可以通过把timeout参数变成列表,通过列表索引来进行改值
#!/usr/bin/python3
 
import time
import logging
from random import randint
 
 
def run_time(timeout):
  """
  定义检查函数运行时间,并打印对应函数运行时间超出设定时间日志,并支持更改timeout
  """
 
  # python2
  # timeout = [timeout]
   
  # 真正包裹函数
  def out_wrapper(func):
    def wrapper(*args, **kwargs):
       
      start_time = time.time()
      result = func(*args, **kwargs)
      used_time = time.time() - start_time
       
      # 对于超出timeout的函数进行日志打印
      if used_time > timeout:
        msg = '%s: %s > %s' % (func.__name__, used_time, timeout)
        logging.warn(msg)
       
      # python2
      # if used_time > timeout[0]:
      #   msg = '%s: %s > %s' % (func.__name__, used_time, timeout[0])
      #   logging.warn(msg)
      # return result
     
    # 设置timeout参数值
    def set_timeout(value):
      nonlocal timeout
      timeout = value
    wrapper.set_timeout = set_timeout
     
    # python2
    # def set_timeout(value):
    #   timeout[0] = value
    # wrapper.set_timeout = set_timeout
     
    return wrapper
  return out_wrapper
 
 
@run_time(1.5)
def func():
  # 随机有50%的几率程序沉睡1秒
  while randint(0, 1):
    time.sleep(1)
  print('func_run')
 
if __name__ == "__main__":
  for _ in range(10):
    func()
     
  print('_'*50)
   
  # 更改run_time装饰器中timeout参数
  func.set_timeout(2)
  for _ in range(10):
    func()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
Python3中的bytes和str类型详解
May 02 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
Python使用re模块验证危险字符
May 21 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
python实现简单的学生管理系统
Feb 22 Python
python MySQLdb使用教程详解
Mar 20 #Python
django中的HTML控件及参数传递方法
Mar 20 #Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 #Python
python如何定义带参数的装饰器
Mar 20 #Python
Python回文字符串及回文数字判定功能示例
Mar 20 #Python
python如何把嵌套列表转变成普通列表
Mar 20 #Python
Python内置函数reversed()用法分析
Mar 20 #Python
You might like
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
WINXP下apache+php4+mysql
2006/11/25 PHP
php email邮箱正则
2008/10/08 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
javascript编程起步(第七课)
2007/02/27 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Tornado 多进程实现分析详解
2018/01/12 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
python如何生成网页验证码
2018/07/28 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Python 列表反转显示的四种方法
2020/11/16 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
关于旷工的检讨书
2014/02/02 职场文书
教育学习自我评价
2014/02/03 职场文书
新学期决心书
2014/03/11 职场文书
人事专员岗位说明书
2014/07/29 职场文书
学前教育专业求职信
2014/09/02 职场文书
初中毕业生自我评价
2015/03/02 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
2016年少先队活动总结
2016/04/06 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书