tools/funcutils.py (22 lines of code) (raw):

import time class get_rate_limited_function(object): """ Close over a function and a time limit in seconds. The resulting object can be called like the function, but will not delegate to the function if that function was called through the object in the time limit. Clients can ignore the time limit by calling the function directly as the func attribute of the object. """ def __init__(self, func, limit): self.func, self.limit = func, limit self.last_called = False def __call__(self, *args, **kwargs): elapsed = time.time() - self.last_called if elapsed >= self.limit: self.last_called = time.time() return self.func(*args, **kwargs) def __repr__(self): return '{cls_name}(func={func}, limit={limit}, last_called={last_called})'.format( cls_name=self.__class__.__name__, func=self.func, limit=self.limit, last_called=self.last_called, ) def merge_dicts(*dict_args): """ Given any number of dicts, shallow copy and merge into a new dict, precedence goes to key value pairs in latter dicts. """ result = {} for dictionary in dict_args: result.update(dictionary) return result