[Checkins]
SVN: zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.
added invalidation method to method.cachedAt
Christian Zagrodnick
cz at gocept.com
Fri May 18 11:22:39 EDT 2007
Log message for revision 75830:
added invalidation method to method.cachedAt
Changed:
U zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.py
U zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.txt
-=-
Modified: zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.py
===================================================================
--- zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.py 2007-05-18 14:34:04 UTC (rev 75829)
+++ zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.py 2007-05-18 15:22:39 UTC (rev 75830)
@@ -26,18 +26,25 @@
def __call__(self, func):
def decorated(instance, *args, **kwargs):
- kw = kwargs.items()
- kw.sort()
- key = (args, tuple(kw))
cache = self.cache(instance)
+ key = self._get_cache_key(*args, **kwargs)
try:
v = cache[key]
except KeyError:
v = cache[key] = func(instance, *args, **kwargs)
return v
+ decorated.invalidate = self.invalidate
return decorated
+ def invalidate(self, instance, *args, **kwargs):
+ cache = self.cache(instance)
+ key = self._get_cache_key(*args, **kwargs)
+ try:
+ del cache[key]
+ except KeyError:
+ pass
+
def cache(self, instance):
try:
cache = getattr(instance, self.attribute_name)
@@ -45,3 +52,10 @@
cache = BTrees.OOBTree.OOBTree()
setattr(instance, self.attribute_name, cache)
return cache
+
+ @staticmethod
+ def _get_cache_key(*args, **kwargs):
+ kw = kwargs.items()
+ kw.sort()
+ key = (args, tuple(kw))
+ return key
Modified: zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.txt
===================================================================
--- zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.txt 2007-05-18 14:34:04 UTC (rev 75829)
+++ zope.cachedescriptors/trunk/src/zope/cachedescriptors/method.txt 2007-05-18 15:22:39 UTC (rev 75830)
@@ -50,3 +50,16 @@
>>> list(sorted(point._cache.items()))
[(((2, 2), ()), 1.0), (((5, 2), ()), 4.0)]
+
+
+It is possible to exlicitly invalidate the data::
+
+ >>> point.distance.invalidate(point, 5, 2)
+ >>> point.distance(5, 2)
+ computing distance
+ 4.0
+
+Invalidating keys which are not in the cache, does not result in an error::
+
+
+ >>> point.distance.invalidate(point, 47, 11)
More information about the Checkins
mailing list