diff options
author | Jason Kirtland <jek@discorporate.us> | 2008-10-17 20:04:11 +0000 |
---|---|---|
committer | Jason Kirtland <jek@discorporate.us> | 2008-10-17 20:04:11 +0000 |
commit | 654794cdcf89eb7842ddf06bd9316bd860bca9e7 (patch) | |
tree | 2ffdb84bef6c5af105b1e8606b24202a20ac7dd3 /lib/sqlalchemy/util.py | |
parent | 6481d24642488bd445bc0ab29d211fe468814e1c (diff) | |
download | sqlalchemy-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.py | 66 |
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): |