En Fri, 04 Apr 2008 02:24:14 -0300, <[EMAIL PROTECTED]> escribió:
> On Apr 3, 8:04 pm, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote:
>> En Thu, 03 Apr 2008 21:21:11 -0300, Dan Bishop <[EMAIL PROTECTED]>
>> escribió:
>> > On Apr 3, 6:33 pm, [EMAIL PROTECTED] wrote:
>> >> I saw example of memoize function...here is snippet
>>
>> >> def memoize(fn, slot):
>> >> def memoized_fn(obj, *args):
>> >> if hasattr(obj, slot):
>> >> return getattr(obj, slot)
>> >> else:
>> >> val = fn(obj, *args)
>> >> setattr(obj, slot, val)
>> >> return val
>> >> return memoized_fn
>>
> Thanks Gabriel and Dan,
> But I am still confuse on...
> what is obj?
>
> Let say
> def f(node): return max(node.path_cost+h(node), getattr(node, 'f', -
> infinity))
> f = memoize(f,'f')
>
> what is this doing?
> I am passing string 'f' as second argument? right? so evertime in
> function memoize,
> I am doing hasattr(obj, slot), I am saying hasattr(obj, 'f')?
>
> I kindof understand that I am returning maximum of pre-computed
> value(if there is already) vs. new calculation.
> But syntax is throwing me off.
It *is* confusing. And a bit strange that it does not use the args
argument as a key (if it is true that f(*args) doesn't depend on args, why
using args in the first place?)
You may be calling f as f(a,b,c) or as a.f(b,c) - in both cases, obj is
`a`, the first argument (or "self" when used as a method)
An alternative version (with the same limitations with regard to *args)
but usable as a mehtod decorator:
from functools import wraps
def memoize(slot):
def decorator(fn, slot=slot):
@wraps(fn)
def inner(self, *args):
if hasattr(self, slot):
return getattr(self, slot)
else:
val = fn(self, *args)
setattr(self, slot, val)
return val
return inner
return decorator
class Foo(object):
def __init__(self, items):
self.items = tuple(items)
@memoize('max')
def hardtocompute(self):
return max(self.items)
a = Foo((10,20,30))
assert not hasattr(a,'max')
assert a.hardtocompute()==30
assert a.max==30
del a.items
assert a.hardtocompute()==30
There is an excelent article by Michele Simionato explaining decorators
with some useful recipes.
http://www.phyast.pitt.edu/~micheles/python/documentation.html
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list