使用Python装饰器实现限制函数调用的频率

作者: 我有一只碗 | 来源:发表于2017-09-01 23:57 被阅读0次

    装饰器算是Python非常有用的特性之一了,因为它实现了DRYC(不要重复你自己的代码),但是它非常难驾驭,十分不好理解。

    def doc_it(f):
        def decorator(*args, **kwargs):
            print('This is doc')
            return f(*args, **kwargs)
        return decorator
    

    这就是一个标准的装饰器了,它能在所装饰的函数调用前自动输出一行文本

    @doc_it
    def func():
        print('a')
    

    上面的代码做的事情就是把func作为参数传入了装饰器doc_it,相当于func=doc_it(func),我们可以得到一个新函数,尽管我们还可以通过func调用它,但是输出一下func._name_发现会得到decorator,说明它确实已经变成了另外一个函数

    用这个有用的特性我们可以实现一个函数内部缓存的效果,原理如下:

    def count_it(f):
        count = [0]
        def decorator(*args, **kwargs):
            count[0] += 1
            print('count is {count}'.format(count[0]))
            return f(*args, **kwargs)
        return decorator
    

    这个装饰器我们可以轻易统计出一个函数调用的次数,但是我们那个缓存为什么要使用list类型呢,用一个int类型岂不是更好,但是这里只能用可变类型的数据,具体原因参考默认参数。

    然后我们用装饰器实现限制函数调用的频率就很简单了

    from time import time
    
    def time_required(f):
        last = [time()]
        def decorator(*args, **kwargs):
            if time() - last[0] < 10:
                raise RuntimeError('This time not allow, please wait to {time}'.format(time=last[0] + 10))
            last[0] = time()
            return f(*args, **kwargs)
        return decorator
    

    相关文章

      网友评论

        本文标题:使用Python装饰器实现限制函数调用的频率

        本文链接:https://www.haomeiwen.com/subject/lnhljxtx.html