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模拟登录验证码(代码简单)
Feb 06 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
python实现简单登陆流程的方法
Apr 22 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
Python基础教程之异常详解
Jan 10 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
python中的句柄操作的方法示例
Jun 20 Python
python可视化爬虫界面之天气查询
Jul 03 Python
postman模拟访问具有Session的post请求方法
Jul 15 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
Python读取YAML文件过程详解
Dec 30 Python
python3.4中清屏的处理方法
Jul 06 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图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
资金主管岗位职责范本
2014/03/04 职场文书
会计员岗位职责
2014/03/15 职场文书
敬老院标语
2014/06/27 职场文书
师德师风的心得体会
2014/09/02 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python