On Sun, Apr 17, 2011 at 6:45 PM, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote: > On Sun, 17 Apr 2011 16:21:53 +1200, Gregory Ewing wrote: > >> Chris Angelico wrote: >> >>> def fac(n): >>> # attempt to get from a cache >>> return? cache[n] >>> # not in cache, calculate the value >>> ret=1 if n<=1 else fac(n-1)*n >>> # and cache and return it >>> cache[n]=ret; return ret >> >> My idiom for fetching from a cache looks like this: >> >> def get_from_cache(x): >> y = cache.get(x) >> if not y: >> y = compute_from(x) >> cache[x] = y >> return y >> >> which doesn't require any conditional returns. > > > I'm sure you realise that that snippet needlessly recalculates any cached > result that happens to be false, but others reading might not.
Sure. In my (somewhat contrived) example of factorials, that's going to be true (apart from 0! = 0); and if the function returns a string or other object rather than an integer, same thing. If there's the possibility of _ANY_ value coming back from the computation, then it would need to be done as: if x in cache: return cache[x] or as: try: return cache[x] except KeyError: # calculate etc Obviously, as with everything, you need to know your own code and your own data. Chris Angelico -- http://mail.python.org/mailman/listinfo/python-list