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 MySQLdb Linux下安装笔记
May 09 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
解决python 输出是省略号的问题
Apr 19 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
python可视化实现代码
Jan 15 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
Python配置文件处理的方法教程
Aug 29 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
使用python实现生成用户信息
2017/03/20 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
个人工作表现自我评价
2015/03/06 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
JavaScript前端面试组合函数
2022/06/21 Javascript
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers