Memoization and encapsulation

Just just at xs4all.nl
Sat Dec 31 03:23:05 EST 2005


In article <pan.2005.12.31.04.23.25.584823 at REMOVETHIScyber.com.au>,
 Steven D'Aprano <steve at REMOVETHIScyber.com.au> wrote:

> I was playing around with simple memoization and came up with something
> like this:
> 
> _cache = {}
> def func(x):
>     global _cache

There's no need to declare _cache as global, since you're not assigning 
to it. So this global isn't all that pesky after all...

>     if _cache.has_key(x): 
>         return _cache[x]
>     else:
>         result = x+1  # or a time consuming calculation...
>         _cache[x] = result
>         return result
> 
> when it hit me if I could somehow bind the cache to the function, I could
> get rid of that pesky global variable.
[ ... ]
> What do folks think? Is there a better way?

I actually prefer such a global variable to the default arg trick. The 
idiom I generally use is:

_cache = {}
def func(x):
    result = _cache.get(x)
    if result is None:
        result = x + 1  # or a time consuming calculation...
        _cache[x] = result
    return result

Just



More information about the Python-list mailing list