On Mar 28, 8:47 am, Michael Bayer <[email protected]> wrote:
> On Mar 28, 2012, at 9:37 AM, Michael Bayer wrote:
>
>
>
> > 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__
>
> >    def __get__(self, obj, cls):
> >        if obj is None:
> >            return self
> >        obj.__dict__[self.__name__] = result = self.fget(obj)
> >        return result
>
> thinking a little further, here's an ORMish way to use it:
>
> def invalidates(source, *attr):
>     @event.listens_for(source, 'set')
>     def invalidate(target, value, old, initiator):
>         for attr_ in attr:
>             target.__dict__.pop(attr_, None)
>
> class MyClass(Base):
>     __tablename__ = 'mytable'
>
>     id = Column(Integer, primary_key=True)
>     a = Column(Integer)
>     b = Column(Integer)
>
>     @memoized_property
>     def c(self):
>         print "evaluating a + b"
>         return self.a + self.b
>
> invalidates(MyClass.a, 'c')
> invalidates(MyClass.b, 'c')


Thanks for the advice.  I'll play with this to find the best approach
for my application.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to