robert wrote: > Bruno Desthuilliers wrote: >> robert wrote: >>> Bruno Desthuilliers wrote: >>>> robert a écrit : >>>> (snip) >>>>> class MemoCache(dict): # cache expensive Objects during a session >>>>> (memory only) >>>>> def memo(self, k, f): >>>>> try: return self[k] >>>>> except KeyError: #<--------- was error >>>>> return self.setdefault(k, f()) >>>>> cache=MemoCache() >>>>> ... >>>>> >>>>> o = cache.memo( complex-key-expr, lambda: expensive-calc-expr ) >>>>> >>>> And how do you get back the cached value without rewriting both >>>> complex-key-expr *and* expensive-calc-expr ? Or did I missed the >>>> point ? >>> the complex-key-expr is written only once in the code >> >> How do you get something back from the cache then ? >> >>> expensive-calc-expr is written only once in code >> >> Same problem here... I fail to understand how you intend to use this >> "cache". > > the first time, "self.setdefault(k, f())" executes the lambda ("f()"), (snip) Robert, that's not the point. I do have enough Python knowledge to understand this (totally trivial) code !-)
What I don't understand is how this code is supposed to save you from having to actually write both complex-key-expr and expensive-calc-expression more than once. You need them both each time you access the cache - whether the result of expensive-calc-expression has already been cached or not. Now this seems so obvious that I guess I failed to understand some point in your original spec (emphasis is mine): """ I want to use a computation cache scheme like o = CACHECOMPUTE complex-key-expr expensive-calc-expr frequently and elegantly *without writing complex-key-expr or expensive-calc-expr twice*. """ -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list