def lazy(x, *args, **kwds): """Executes x(*args, **kwds) when called""" if args or kwds: return lambda : x(*args, **kwds) else: return x # No arguments, so x must be callable by itself
[snip]
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[1]:
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...
Steve
[1] 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. -- http://mail.python.org/mailman/listinfo/python-list