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 14 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
详解Python核心对象类型字符串
Feb 11 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
六行python代码的爱心曲线详解
May 17 Python
python程序 创建多线程过程详解
Sep 23 Python
python和c语言哪个更适合初学者
Jun 22 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
详解pandas apply 并行处理的几种方法
Feb 24 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
使用PHP模拟HTTP认证
2006/10/09 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
小学生家长评语大全
2014/02/10 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
年会邀请函范文
2015/01/30 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
MySQL主从切换的超详细步骤
2022/06/28 MySQL
Fluentd搭建日志收集服务
2022/09/23 Servers