請實現一個裝飾器,限制該函數被調用的頻率,如10秒一次
阿新 • • 發佈:2018-08-07
空間 打包 函數作為參數 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秒一次