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上基于Markov链生成伪随机文本的教程
Apr 17 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
python 字典(dict)按键和值排序
Jun 28 Python
Python导入模块时遇到的错误分析
Aug 30 Python
python如何求解两数的最大公约数
Sep 27 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 Python
python如何保存文本文件
Jun 07 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
Python实现位图分割的效果
Nov 20 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
2014最热门的24个php类库汇总
2014/12/18 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
使用python将时间转换为指定的格式方法
2018/11/12 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
深入理解Django-Signals信号量
2019/02/19 Python
python多线程http压力测试脚本
2019/06/25 Python
python绘制彩虹图
2019/12/16 Python
python numpy数组中的复制知识解析
2020/02/03 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
档案检查欢迎词
2014/01/13 职场文书
关于迟到的检讨书
2014/01/26 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
微笑服务标语
2014/06/24 职场文书
小学生家长意见
2015/06/03 职场文书
清洁工工作总结
2015/08/11 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python
详解nginx进程锁的实现
2021/06/14 Servers
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers