我真的很可能實現這個作爲裝飾,因爲它聽起來像可重用的東西。下面示例允許你在你想要的任何功能重用guarded
,指定的超時時間(以秒計)爲每次使用裝飾上功能:
import time
from functools import wraps
_guards = {}
def guarded(tm):
def wrapper(fn):
_guards[fn] = {'timeout': tm}
@wraps(fn)
def inner(*args, **kwargs):
t = time.time()
if 'last' not in _guards[fn] or \
t - _guards[fn]['last'] > _guards[fn]['timeout']:
_guards[fn]['last'] = t
fn(*args, **kwargs)
return inner
return wrapper
money = 0
@guarded(2)
def add_money():
global money
money += 100
print money
這裏,add_money
僅2秒超時之後允許:
In [2]: add_money()
100
In [3]: add_money()
In [4]: add_money()
200
In [5]: add_money()
In [6]: add_money()
In [7]: add_money()
In [8]: add_money()
300
是的,有不使用全球字典來追蹤這個東西(壞的運行時多線程),並使用threading.local
而不是爭論,但還有點兒這個答案的範圍之內。
[在TKinter中的python GUI中編寫一個計時器的代碼](http://stackoverflow.com/questions/2400262/code-a-timer-in-a-python-gui-in-tkinter)和所有其他人則搜索「tkinter」和「timer」。 – tom10
我不認爲這是計時器選項的重複。這個問題是關於如何在一段時間內禁用功能。儘管使用與定時器相同的機制完成了這項工作,但值得一提的是,值得一提的是IMO。 –