1. 程式人生 > >請實現一個裝飾器,限制該函數被調用的頻率,如10秒一次

請實現一個裝飾器,限制該函數被調用的頻率,如10秒一次

空間 打包 函數作為參數 get false val orm cti res

一、通過函數的閉包/命名空間原理,裝飾器來實現這個功能

裝飾器及原理可參考我的這篇文章
這個裝飾器可以隨便設置時間很方便,每個函數都有獨立的標記時間

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import time

def deco_limit(s, foo= None):
    """
    這是個函數裝飾器,可以控制訪問頻率
    :param s: 該參數為訪問頻率,每多少s一次
    :param foo: 可選參數,用戶自定制裝飾器邏輯(比如cookie或狀態驗證等,執行返回值為False則不執行函數)  #該參數實現了,我又刪了,不好用,給你提供思路自己做
    :return:
    """
    def wrpper(func):
        """
        該函數接受被修飾函數作為參數,返回裝飾器,變量func_identify為變量標識,
        存儲被修飾函數的name為key,value為調用成功的時間戳。key-second存儲為時間頻率
        :param func: 參數為被修飾函數
        :return:
        """
        name = func.__name__
        func_identify ={name: 0,'foo': foo, 'second': s}
        def inner(*args, **kwargs):
            """
            執行函數
            :param args: 將接收的參數,打包
            :param kwargs:
            :return:
            """
            useable_time = func_identify[name] + func_identify['second']
            time_now = time.time()
            remain_time = useable_time-time_now
            # print(remain_time)
            if time_now > useable_time:
                func_identify[name] = time_now #設置調用時間
                res = func(*args,**kwargs)
            else:
                print('\033[32;1mFunction \033[31;1m{0} \033[0m'                      .format(name)+'\033[32;1mcan be used after {0:.2f} seconds later\033[0m'                      .format(remain_time if remain_time > 0 else abs))
                res = None
            return res

        return inner
    return wrpper




#以下為被裝飾函數foo1
@deco_limit(5)     #在這兒參數為設置調用間隔時間
def foo1(*args, **kwargs):
    print(args)
    return 'everything is ok'

#以下為被修飾函數func1
@deco_limit(3)     #間隔時間為3秒
def func1(*args, **kwargs):
    print(**kwargs)
    return '呱呱呱'

print('foo1的執行結果:')
print(foo1(1,2,3))
print(foo1(2,3,4))
time.sleep(3)
print(foo1(5,6,7))
time.sleep(2)
print(foo1(7,9,0))

print('\nfunc1的執行--:')
print(func1(1,2,3))
print(func1(2,3,4))
time.sleep(3)
print(func1(5,6,7))

#-----以下為運行結果------------
foo1的執行結果:
(1, 2, 3)
everything is ok
Function foo1 can be used after 5.00 seconds later
None
Function foo1 can be used after 2.00 seconds later
None
(7, 9, 0)
everything is ok

func1的執行--:

呱呱呱
Function func1 can be used after 3.00 seconds later
None

呱呱呱

#-------------------------------------------------------

請實現一個裝飾器,限制該函數被調用的頻率,如10秒一次