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中http请求方法库汇总
Jan 06 Python
Python实现购物程序思路及代码
Jul 24 Python
Python中的单继承与多继承实例分析
May 10 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
编写python代码实现简单抽奖器
Oct 20 Python
Python中基础数据类型 set集合知识点总结
Aug 02 Python
详解Python中的for循环
Apr 30 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
星际RPG字典
2020/03/04 星际争霸
世界第一个无线广播电台 KDKA
2021/03/01 无线电
关于php mvc开发模式的感想
2011/06/28 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
使用npy转image图像并保存的实例
2020/07/01 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
快餐店的创业计划书范文
2014/01/29 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
促销活动方案模板
2014/02/24 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
十周年庆典策划方案
2014/06/03 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
化工厂员工工作总结
2015/10/15 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js