python如何修改装饰器中参数
2018-03-20 10:10
639 查看
本文实例为大家分享了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 使用装饰器模式 保证带有默认值的参数不被修改默认值
- python_如何定义带参数的装饰器?
- python 使用装饰器模式 保证带有默认值的参数不被修改默认值
- python 9-3 如何定义带参数的装饰器,提取函数签名python3 inspect.signature()
- python如何定义带参数的装饰器
- python 9-4 如何实现属性可修改的函数装饰器,python3 nolocal或者在python2中列表方式
- python 如何传递字典型变量(不定参数)给c++
- python 函数如何不修改原始列表
- Java中如何在函数中修改参数的值
- [python] 带有参数并且传递参数的装饰器
- 如何修改myeclipse的内存?eclipse.ini中各个参数的作用
- 如何让Tomcat自动Load被修改过的类 servlet如何读取web.xml中的初始参数
- python:大量参数如何传递
- [Python]如何理解Python中的装饰器
- 如何使用wrapper在filter修改request参数
- Swift中如何修改函数的参数
- 如何修改python IDLE代码及语法主题 配色——拷贝的是别人喜欢的,来学会调试自己喜欢的颜色吧
- python-24-如何派生类内置不可变类型并修改其实例化行为?如何为创建大量实例节省内存?
- 如何编写一个修改数值参数的方法