案例:

为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器

需求:

    统计被装饰函数的运行时间

    时间大于timeout时,将此次函数调用记录到log日志中

    运行时可以修改timeout的值

如何解决这个问题?

  1. 定义一个装饰器,计算函数执行时间,并与timeout比较,当大于timeout时候,通过logging模块打印出日志信息
  2. 在包裹函数中添加一个函数,通过这个函数来修改timeout变量
  3. 在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_如何修改装饰器中参数?的更多相关文章

  1. typescript装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  2. JS中bind、call和apply的作用以及在TS装饰器中的用法

    目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...

  3. python3 如何给装饰器传递参数

    [引子] 之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) .那篇文章的定位是入门级的 所以也就没有讲过多的高级主题,决定 ...

  4. 装饰器,装饰器多参数的使用(*arg, **kwargs),装饰器的调用顺序

    一.#1.执行outer函数,并且将其下面的函数名,当作参数 #2.将outer的返回值重新赋值给f1 = outer的返回值 #3.新f1 = inner #4.func = 原f1 #!/usr/ ...

  5. python_如何定义装饰器类?

    案例: 实现一个能将函数调用信息记录到日志的装饰器 需求: 把每次函数的调用时间,执行时间,调用次数写入日志 可以对被装饰函数分组,调用信息记录到不同日志 动态修改参数,比如日志格式 动态打开关闭日志 ...

  6. struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题

    <interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...

  7. python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  8. python 装饰器 传递参数简单案例

    def debug(func): def wrapper(*args, **kwargs): # 指定宇宙无敌参数 print "[DEBUG]: enter {}()".form ...

  9. 【转】odoo 新API装饰器中one、model、multi的区别

    http://blog.csdn.net/qq_18863573/article/details/51114893 1.one装饰器详解 odoo新API中定义方式: date=fields.Date ...

随机推荐

  1. iOS自带API集成二维码、条形码扫描

    源码于 :https://github.com/wangjinfeng/ScanForiOSAPI/tree/main 1.AVFoundation.framework,QuartzCore.fram ...

  2. [Spark内核] 第28课:Spark天堂之门解密

    本課主題 什么是 Spark 的天堂之门 Spark 天堂之门到底在那里 Spark 天堂之门源码鉴赏 引言 我说的 Spark 天堂之门就是SparkContext,这篇文章会从 SparkCont ...

  3. 【zkw费用流】[网络流24题]餐巾计划问题

    题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...

  4. 简易 bokeh 图像散景效果算法实现

    bokeh百度百科的解释 摄影镜头光圈大小和拍摄距离决定了拍摄时的景深,相对于焦点位置,焦点前与焦点后的被拍摄物体会显得模糊,这个模糊区域被称为焦外.焦外具体的模糊程度还受到镜头中镜片单体和组合的物理 ...

  5. Spring Boot快速入门(三):依赖注入

    原文地址:https://lierabbit.cn/articles/6 spring boot使用依赖注入的方式很简单,只需要给添加相应的注解即可 @Service用于标注业务层组件 @Contro ...

  6. addEventListener attachEvent和解决IE 6 7 8 this指向错误

    [JS] addEventListener attachEvent和解决IE 6 7 8 this指向错误   电梯直达 1#    php 发表于 2014/4/13 01:17 | 只看该作者  ...

  7. 【转】qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式

    狸窝  复制  收藏  保存到桌面  快速找教程方案  反馈需求  社会主义核心价值观  客服QQ41442901   马上注册 升级VIP   对于视频文件之间的转换问题,我也已经是无力吐槽了,每个 ...

  8. TLD网络资源汇总--学习理解之(四)

    原文:http://blog.csdn.net/mysniper11/article/details/8726649 引文地址:http://www.cnblogs.com/lxy2017/p/392 ...

  9. 从头开始基于Maven搭建SpringMVC+Mybatis项目(3)

    接上文内容,本节介绍基于Mybatis的查询和分页功能,并展示一个自定义的分页标签,可重复使用以简化JSP页面的开发. 从头阅读传送门 在上一节中,我们已经使用Maven搭建好了项目的基础结构,包括一 ...

  10. WebPack错误集

    webpack-dev-server跨域设置反向代理出现404错误 问题栈 分析解决 看到404后,再次看了下启动服务配置文件,估计是pathRewrite这个没起作用; //代理服务器 const ...