zoukankan      html  css  js  c++  java
  • python 修改的函数装饰器

    把好的代码记录下来 方便以后学习

     修改的函数参数装饰器

    from functools import wraps
    import time
    import logging
    def warn(timeout):
        #timeout=[timeout]  python 2.x
        def decorator(func):
            def wrapper(*args,**kargs):
                start = time.time()
                res = func(*args,**kargs)
                used = time.time()-start
                #if(used > timeout[0]):  python 2.x
                if(used > timeout):
                    msg = '"%s":"%s" > %s' % (func.__name__,used,timeout)
                    logging.warn(msg)
                return res
            def setTimeOut(k):
                nonlocal timeout
                timeout = k
                #timeout[0] = k    python 2.x
            wrapper.setTimeOut = setTimeOut
            return wrapper
        return decorator
    
    from random import randint
    @warn(1.5)
    def test():
        print('in test')
        while randint(0,1):
            time.sleep(0.5)
    
    for _ in range(30):
        test()
    test.setTimeOut(1)
    for _ in range(30):
        test()

     检测带参数类型的函数装饰器

    from inspect import signature
    def typeassert(*ty_args,**ty_kargs):
        def decorator(func):
            sig = signature(func)
            btypes = sig.bind_partial(*ty_args,**ty_kargs).arguments
            def wrapper(*args,**kargs):
                for name,obj in sig.bind_partial(*args,**kargs).arguments.items():
                    if name  in btypes:
                        if not isinstance(obj,btypes[name]):
                            raise TypeError("%s must be %s" % (name,btypes))
                return func(*args,**kargs)
            return wrapper
        return decorator
    
    @typeassert(int,str,list)
    def f(a,b,c):
        print(a,b,c)
    
    f(1,'abc',[1,2,3])
    f(1,2,[1,2,3])
  • 相关阅读:
    redis的两种安装方法
    http头部信息
    软件测试技术知识
    github使用
    3 python之基础概要
    2 Python之编程语言介绍及变量
    1 Python入门及计算机硬件知识
    Linux常用命令
    CMDB小练习
    CMDB和运维自动化
  • 原文地址:https://www.cnblogs.com/zz-952/p/10004335.html
Copyright © 2011-2022 走看看