def __call__(self, im_self, *args, **kwargs): '''Via the magic that is partial functions returned from __get__, im_self is the instance object of the class we're decorating a method of and [kw]args are the actual parameters to the decorated method''' region = cache_regions[im_self.cache_region] if not region.enabled: return self.decorated_function(im_self, *args, **kwargs) key = (self.decorated_function.__name__, getattr(im_self, 'sid', im_self.uid), tuple(getattr(x, 'sid', x) for x in args), tuple((k, getattr(v, 'sid', v)) for k, v in sorted(kwargs.iteritems())), defaults.sid) key = dumps(key) found, value = region.get(key) if found: return value else: im_self.logger.debug('creating new cache entry for {}.{}' .format(im_self.__class__.__name__, self.decorated_function.__name__)) value = self.decorated_function(im_self, *args, **kwargs) region.set(key, value) return value
def _calc_sid(self): object.__setattr__(self, 'sid', dumps((_file_sha, tuple((k, v) for k, v in sorted(self.__dict__.iteritems())))))