Easier way to save result of a function?

James Mitchelhill james at disorderfeed.net
Tue Jul 4 21:10:26 EDT 2006


On Tue, 4 Jul 2006 16:53:27 -0700, Alex Martelli wrote:

> James Mitchelhill <james at disorderfeed.net> wrote:
<snip>
>> I'm trying to write a class that analyses some data. I only want it to
>> do as much work as necessary, so it saves method results to a
>> dictionary
<snip>

> For your needs, I would suggest first defining your class "normally"
> (writing the methods without memoization) and then looping on all
> methods of interest decorating them with automatic memoization; I just
> suggested a similar kind of looping for decoration purposes in my very
> latest post on another thread;-).  You won't use the _syntax_ of
> decorators, but, hey, who cares?-)
> 
> Assuming (for simplicity but with no real loss of conceptual generality)
> that all of your heavy-processing methods have names starting with 'do',
> and that each of them takes only 'self' as its argument, you could for
> example do something like:

Thanks, that's awesome! Definitely not something I'd have ever been able
to work out myself - I think I need to learn more about nested functions
and introspection.

> def memoizeMethod(cls, n, m):
>   def decorated(self):
>     if n in self._memo: return self._memo[n]
>     result = self._memo[n] = m(self)
>     return result
>   decorated.__name__ = n
>   setattr(cls, n, decorated)  
>     
> def memoizeClass(cls):
>   cls._memo = {}
>   for n,m in inspect.getmembers(cls, inspect.ismethod):
>     if not n.startswith('do'): continue
>     memoizeMethod(cls, n, m)

(I've changed inspect.ismethoddescriptors to inspect.ismethod and
unindented the last line.)
 
> Now just write your MyClass with the doThis doThat methods you want, and
> right after the class statement add
> 
> memoizeClass(MyClass)
> 
> 
> Voila, that's it (untested details, but the general idea is sound;-).

Thanks again.

-- 
James Mitchelhill
james at disorderfeed.net
http://disorderfeed.net



More information about the Python-list mailing list