python如何修改装饰器中参数
作者:北门吹雪 发布时间:2021-08-18 15:28:27
标签:python,装饰器,参数
本文实例为大家分享了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()
来源:http://www.cnblogs.com/2bjiujiu/p/7293912.html


猜你喜欢
- 重装系统永远是个好办法,但有谁喜欢这么做呀:( 后来无意发现是卸载的时候没有卸载完全导致,下面给出完整的卸载MySQL 5.1的卸载方法:
- 本文实例讲述了Python面向对象之继承原理与用法。分享给大家供大家参考,具体如下:目标单继承多继承面向对象三大特性封装 根据 职责 将 属
- 一、简介是一个 python 内置包,不需要额外安装即可使用urllib 是 Python 标准库中用于网络请求的库,内置四个模块,分别是u
- 本文介绍一款工具 go-callvis,它能够将 Go 代码的调用关系可视化出来,并提供了可交互式的 web 服务。go get -u gi
- 在python中启动和关闭线程:首先导入threadingimport threading然后定义一个方法def serial_read()
- 在Bootstrap的官网上,提供了一种导航栏的组件:只要在站点文件夹放好JQ与Bootstrap输入如下代码: <!DOCTYPE
- 通常,当一个页面有太多信息要显示,而一页塞又不下所有信。为了请求速度、美观以及其他的各种理由,分页就会被我们请过来。让我们的用户可以选择是否
- 很多网站注册时都会要求输入电子邮箱,其应用场景是比较广的,例如注册账号接收验证码、注册成功通知、登录通知、找回密码验证通知等。本文将介绍如何
- 在开始安装前,先说明一下mysql-5.6.4与较低的版本在安装上的区别,从mysql-5.5起,mysql源码安装开始使用cmake了,因
- 一个简单的tokenizer分词(tokenization)任务是Python字符串处理中最为常见任务了。我们这里讲解用正则表达式构建简单的
- 题目描述原题链接 :35. 搜索插入位置 - 力扣(LeetCode) (leetcode-cn.com)给定一个排序数组和一个目标值,在数
- 这篇文章主要介绍了Python监控服务器实用工具psutil使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 前言这是Go单元测试从入门到放弃系列教程的第1篇,介绍了如何使用httptest和gock工具进行网络测试。在上一篇《Go单元测试从入门到放
- 用法:matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None, basefmt
- 目录1、sysbench介绍#项目下载地址:2、sysbench安装过程#安装相关依赖#安装过程开始#提示说明:#常规命令行选项#sysbe
- 一个问题纠结很久,反复确认语法问题。但是后来网上搜了一下,茅塞顿开。特此总结一下。mysql> grant select,insert
- 本文实例讲述了Python数学形态学。分享给大家供大家参考,具体如下:一 原始随机图像1、代码import numpy as npimpor
- python 根据正则表达式提取指定的内容正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事。 下面演
- 最近设计一个优惠券列表,有个属性是有效日期,因为空间有限,必须要把开始日期和结束日期在一行显示,这样就出现一排的数字,日期有好几种我们习惯的
- 如何在数据库中限制检索行数?为了照顾显示器屏幕的大小,使检索结果更整齐明了一些,请问,可以控制数据库的检索行数吗? &