Rotwang wrote: > I've written a > decorator to eliminate repeated calls by storing a dictionary whose > items are arguments and their results:
> The problem is that the dictionary key > stored depends on how the function was called, even if two calls should > be equivalent; hence the original function gets called more often than > necessary. I think you can normalize the arguments with inspect.getcallargs(). A sketch: >>> import inspect >>> def memo(f): ... def g(*args, **kw): ... callargs = tuple(sorted(inspect.getcallargs(f, *args, **kw).items())) ... try: ... return cache[callargs] ... except KeyError: ... result = cache[callargs] = f(*args, **kw) ... return result ... cache = {} ... return g ... >>> @memo ... def f(x, y=2): ... print "calling f(%s, %s)" % (x, y) ... return x + y ... >>> f(1, 2) calling f(1, 2) 3 >>> f(1) 3 >>> f(y=2, x=1) 3 -- http://mail.python.org/mailman/listinfo/python-list