summaryrefslogtreecommitdiff
path: root/psutil/_common.py
diff options
context:
space:
mode:
authorGiampaolo Rodola' <g.rodola@gmail.com>2013-12-07 20:33:16 +0100
committerGiampaolo Rodola' <g.rodola@gmail.com>2013-12-07 20:33:16 +0100
commitc234084a8792a33cf3a180ab816d54e24f9b010f (patch)
tree8539c2be7d86c4f2088e78eaaecff3f9d9853a08 /psutil/_common.py
parent5f29c2a443a24c3a0db555c0e3a836a38db86e59 (diff)
downloadpsutil-c234084a8792a33cf3a180ab816d54e24f9b010f.tar.gz
fix issue 454: cached properties should be read-only
Diffstat (limited to 'psutil/_common.py')
-rw-r--r--psutil/_common.py22
1 files changed, 12 insertions, 10 deletions
diff --git a/psutil/_common.py b/psutil/_common.py
index d041edd5..7a8fc24f 100644
--- a/psutil/_common.py
+++ b/psutil/_common.py
@@ -75,18 +75,20 @@ def memoize(f):
return memf
-class cached_property(object):
+# http://code.activestate.com/recipes/576563-cached-property/
+def cached_property(fun):
"""A memoize decorator for class properties."""
- enabled = True
-
- def __init__(self, func):
- self.func = func
-
- def __get__(self, instance, type):
- ret = self.func(instance)
- if self.enabled:
- instance.__dict__[self.func.__name__] = ret
+ @wraps(fun)
+ def get(self):
+ try:
+ return self._cache[fun]
+ except AttributeError:
+ self._cache = {}
+ except KeyError:
+ pass
+ ret = self._cache[fun] = fun(self)
return ret
+ return property(get)
# http://goo.gl/jYLvf