我实际上可能会将其作为装饰器来实现,因为它听起来像是可重用的东西。下面的示例允许您重用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
是的,有一些争论不使用全局 dict 来跟踪这些东西(运行多线程时不好)threading.local
而是使用,但这有点超出了这个答案的范围。