Le Mon, 09 Mar 2009 18:04:32 -0400, Terry Reedy <tjreedy@udel.edu> s'exprima ainsi:
Lambdas are function-defining expressions used *within* statements that give the resulting function object a stock .__name__ of '<lambda>'. The syntax could have been augmented to include a real name, so the stock-name anonymity is a side-effect of the chosen syntax. Possibilities include lambda name(args): expression lambda <name> args: expression The latter, assuming it is LL(1) parse-able, would even be compatible with existing code and could still be added.
Contrarywise, function-defining def statements could have been allowed to omit the name. To be useful, the object (with a .__name__ such as '<def>', would have to get a default namespace binding such as to '_', even in batch mode.
I do not agree with that. It is missing the point of lambdas. Lambdas are snippets of code equivalent to expressions to be used in place. Lambdas are *not* called, need not beeing callable, rather they are *used* by higher order functions like map. The fact that they do not have any name in syntax thus properly matches their semantic "anonymousity" ;-)
A multi-line lambda (technically, multi-statement)
The problem is that 'multi-statement expression' is an oxymoron in Pythonland.
would also be an anonymous function.
Not necessarily, and irrelevant to the essence of lambda expressions, which is that they are expressions that can be used within statements.
I do not see any contradiction with the "essence of lambda expressions" here. We could have a syntax for multi-statement lambdas without any semantic contradiction. The issue is more probably that it does not fit well python's style and syntax (esp. indent) and would hinder legibility and simplicity. print map(lambda x: {fact = None if x<0 else factorial(x); return "%s: %s" %(x,fact)}, seq) It's ugly, sure. Still, I do not see the "essence of lambda expressions" twisted. I vote -1 to "block-lambdas" for the sake of clarity only. Denis ------ la vita e estrany