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生成随机MAC地址
Mar 10 Python
python将图片文件转换成base64编码的方法
Mar 14 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
Python 多线程实例详解
Mar 25 Python
Python生成随机数组的方法小结
Apr 15 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Python初学者常见错误详解
Jul 02 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 Python
详解anaconda安装步骤
Nov 23 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
python解析xml文件操作实例
2014/10/05 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
动物科学专业求职信
2014/07/27 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
工作年限证明模板
2015/06/15 职场文书
总结python多进程multiprocessing的相关知识
2021/06/29 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
Python 图片添加美颜效果
2022/04/28 Python