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中用memcached来减少数据库查询次数的教程
Apr 07 Python
Python下的subprocess模块的入门指引
Apr 16 Python
python基础知识小结之集合
Nov 25 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
python实现飞机大战游戏
Oct 26 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
详解Python 中的容器 collections
Aug 17 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
php session的锁和并发
2016/01/22 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
简单谈谈原生js的math对象
2017/06/27 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
Python的时间模块datetime详解
2017/04/17 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
幼儿园英语教学反思
2014/01/30 职场文书
培训协议书范本
2014/04/22 职场文书
华清池导游词
2015/02/02 职场文书
三潭印月的导游词
2015/02/12 职场文书
教师年度考核个人总结
2015/02/12 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript