summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util.py
diff options
context:
space:
mode:
authorJason Kirtland <jek@discorporate.us>2008-10-17 20:04:11 +0000
committerJason Kirtland <jek@discorporate.us>2008-10-17 20:04:11 +0000
commit654794cdcf89eb7842ddf06bd9316bd860bca9e7 (patch)
tree2ffdb84bef6c5af105b1e8606b24202a20ac7dd3 /lib/sqlalchemy/util.py
parent6481d24642488bd445bc0ab29d211fe468814e1c (diff)
downloadsqlalchemy-654794cdcf89eb7842ddf06bd9316bd860bca9e7.tar.gz
Moved r5164's @lazy_property to @memoized_property, updated existing @memoize consumers.
Diffstat (limited to 'lib/sqlalchemy/util.py')
-rw-r--r--lib/sqlalchemy/util.py66
1 files changed, 41 insertions, 25 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py
index 770b48796..925c59349 100644
--- a/lib/sqlalchemy/util.py
+++ b/lib/sqlalchemy/util.py
@@ -395,19 +395,6 @@ def iterate_attributes(cls):
yield (key, c.__dict__[key])
break
-class lazy_property(object):
- """A read-only @property that is only evaluated once."""
- def __init__(self, fget, doc=None):
- self.fget = fget
- self.__doc__ = doc or fget.__doc__
- self.__name__ = fget.__name__
-
- def __get__(self, obj, cls):
- if obj is None:
- return None
- obj.__dict__[self.__name__] = result = self.fget(obj)
- return result
-
# from paste.deploy.converters
def asbool(obj):
if isinstance(obj, (str, unicode)):
@@ -1283,23 +1270,52 @@ def function_named(fn, name):
fn.func_defaults, fn.func_closure)
return fn
-@decorator
-def memoize(fn, self):
- """apply caching to the return value of a function."""
+class memoized_property(object):
+ """A read-only @property that is only evaluated once."""
+ def __init__(self, fget, doc=None):
+ self.fget = fget
+ self.__doc__ = doc or fget.__doc__
+ self.__name__ = fget.__name__
- name = '_cached_' + fn.__name__
+ def __get__(self, obj, cls):
+ if obj is None:
+ return None
+ obj.__dict__[self.__name__] = result = self.fget(obj)
+ return result
+
+
+class memoized_instancemethod(object):
+ """Decorate a method memoize its return value.
+
+ Best applied to no-arg methods: memoization is not sensitive to
+ argument values, and will always return the same value even when
+ called with different arguments.
+
+ """
+ def __init__(self, fget, doc=None):
+ self.fget = fget
+ self.__doc__ = doc or fget.__doc__
+ self.__name__ = fget.__name__
+
+ def __get__(self, obj, cls):
+ if obj is None:
+ return None
+ def oneshot(*args, **kw):
+ result = self.fget(obj, *args, **kw)
+ memo = lambda *a, **kw: result
+ memo.__name__ = self.__name__
+ memo.__doc__ = self.__doc__
+ obj.__dict__[self.__name__] = memo
+ return result
+ oneshot.__name__ = self.__name__
+ oneshot.__doc__ = self.__doc__
+ return oneshot
- try:
- return getattr(self, name)
- except AttributeError:
- value = fn(self)
- setattr(self, name, value)
- return value
def reset_memoized(instance, name):
try:
- delattr(instance, '_cached_' + name)
- except AttributeError:
+ del instance.__dict__[name]
+ except KeyError:
pass
class WeakIdentityMapping(weakref.WeakKeyDictionary):