In article <[EMAIL PROTECTED]>, Peter Hansen <[EMAIL PROTECTED]> wrote:
This meets your requirements as stated:
def temp(): foo.var = 1
bind('a', temp)
def temp(): foo.var = 2
bind('b', temp)
del temp
Ewww! *When* is lambda going bye-bye? I apparently haven't been paying close enough attention. Among other considerations, I still instruct people to use lambda for plenty of specific cases.
Well, IMNSHO, it's an empty threat that's been looming on the horizon for several years now. ;) Most recently, Guido mentioned his desire to remove the keyword in his post on Artima, which resulted in a huge debate:
http://www.artima.com/weblogs/viewpost.jsp?thread=98196
Note that in the OP's question, as with Peter's example above, you still can't do it with lambda alone, since you can't mix expressions with assignment. Nonetheless, lambda is nice for delaying binding, and combined with a helper function that sets attributes, it can produce the most concise solution:
bind('a', lambda: setattr(foo, 'var', 1)) bind('b', lambda: setattr(foo, 'var', 2))
The usual response is that you probably want to make a class anyway, and use bound methods for this type of stuff. But I find that in GUI/async programming, often you need a little dab of glue to connect events between objects, and lambda provides a nice way to avoid over-abstracting the problem.
We'll see how this all pans out in the next few years. I'm not too fond of removing features from a language for purely aesthetic reasons, but lambda's really stuck in a syntactic quandry due to the statement/expression dichotomy, so I can understand to some extent Guido's desire to remove it.
Dave -- http://mail.python.org/mailman/listinfo/python-list