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 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
python采集百度百科的方法
Jun 05 Python
Django 连接sql server数据库的方法
Jun 30 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
numpy:找到指定元素的索引示例
Nov 26 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
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
学习ExtJS table布局
2009/10/08 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
vue实现商城购物车功能
2017/11/27 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
python 调用c语言函数的方法
2017/09/29 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
python3.5绘制随机漫步图
2018/08/27 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
SQL SERVER面试资料
2013/03/30 面试题
2014升学宴答谢词
2014/01/26 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
公司请假条格式
2014/04/11 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
历史博物馆观后感
2015/06/05 职场文书
合作合同协议书
2016/03/21 职场文书
子女赡养老人协议书
2016/03/23 职场文书
解析Redis Cluster原理
2021/06/21 Redis
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL