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分割TXT文件成4K的TXT文件
May 23 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
pycharm远程调试openstack代码
Nov 21 Python
python 定义给定初值或长度的list方法
Jun 23 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
在pycharm中实现删除bookmark
Feb 14 Python
简单了解python列表和元组的区别
May 14 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
django有哪些好处和优点
Sep 01 Python
Python实现生活常识解答机器人
Jun 28 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
python中的字典操作及字典函数
2018/01/03 Python
Python使用functools实现注解同步方法
2018/02/06 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
Overload和Override的区别
2012/09/02 面试题
应届毕业生求职信范文
2014/07/07 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
护士实习自荐信
2015/03/06 职场文书
毕业典礼致辞
2015/07/29 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
银行求职信范文
2019/05/13 职场文书