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程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
Python 操作文件的基本方法总结
Aug 10 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
TensorFLow用Saver保存和恢复变量
Mar 10 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
Python3.5多进程原理与用法实例分析
Apr 05 Python
python实现字典嵌套列表取值
Dec 16 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 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 MSSQL 存储过程的方法
2008/12/24 PHP
PHP 身份证号验证函数
2009/05/07 PHP
PHP SQLite类
2009/05/07 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
Python单例模式的两种实现方法
2017/08/14 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
python按比例随机切分数据的实现
2019/07/11 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
Python3运算符常见用法分析
2020/02/14 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
python os模块在系统管理中的应用
2020/06/22 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
局域网标准
2016/09/10 面试题
建筑工程实习自我鉴定
2013/09/19 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL