Tuesday 12 April 2005 17:00 pm Michele Simionato wrote: > I did not put memoize on __new__. I put it on the metaclass __call__. > Here is my memoize: > > def memoize(func): > memoize_dic = {} > def wrapped_func(*args): > if args in memoize_dic: > return memoize_dic[args] > else: > result = func(*args) > memoize_dic[args] = result > return result > wrapped_func.__name__ = func.__name__ > wrapped_func.__doc__ = func.__doc__ > wrapped_func.__dict__ = func.__dict__ > return wrapped_func > > class Memoize(type): # Singleton is a special case of Memoize > @memoize > def __call__(cls, *args): > return super(Memoize, cls).__call__(*args)
I tried it out and found the following "inconsistency": >>> class Foobar(object): ... __metaclass__ = Memoize ... def __init__(self, *args): pass ... >>> Foobar(1) <__main__.Foobar object at 0x4006f7ec> >>> Foobar(2) <__main__.Foobar object at 0x4006f7cc> >>> Foobar(3) <__main__.Foobar object at 0x4006f82c> Unless I'm using it incorrectly (I haven't done much metaclass programming yet) this is the same problem was with using @memoize on __new__ and __init__. Talking so much about singletons I'm not even sure what the definition on calling a singleton with different constructor parameter values is. Anyways, a fix for that could be: class SingletonFactory(type): single = {} def __call__(cls, *args): if (cls not in SingletonFactory.single): SingletonFactory.single[cls] = super(SingletonFactory, cls).__call__(*args) return SingletonFactory.single[cls] i.e. not caching the parameter values or types. Uwe -- http://mail.python.org/mailman/listinfo/python-list