Lazy argument evaluation (was Re: expression form of one-to-many dict?)
steven.bethard at gmail.com
Tue Dec 21 21:50:19 CET 2004
Nick Coghlan wrote:
> def lazy(x, *args, **kwds):
> """Executes x(*args, **kwds) when called"""
> if args or kwds:
> return lambda : x(*args, **kwds)
> return x # No arguments, so x must be callable by itself
> Huh. I think I like the idea of lazy() much better than I like the
> current PEP 312.
Well, 'lazy' is definitely much easier to read, reference in the
documentation, etc. than ':' would be.
> There must be something wrong with this idea that I'm
> missing. . .
Well, it does cost you some conciceness, as your examples show:
lazy(mul, x, y) v.s. :x * y
lazy(itemgetter(i), x) v.s. :x[i]
lazy(attrgetter("a"), x) v.s. :x.a
lazycall(lazy(attrgetter("a"), x)) v.s. :x.a()
Not sure how I feel about this yet. I don't personally need lazy
argument evaluation often enough to be able to decide which syntax would
really be clearer...
 To try to make things as fair as possible, I'm assuming that you've done
from operator import mul, itemgetter, attrgetter
at the top of the module.
More information about the Python-list