Weird lambda rebinding/reassignment without me doing it

Terry Reedy tjreedy at udel.edu
Sat Jul 12 16:32:25 EDT 2008



Steven D'Aprano wrote:
> On Thu, 10 Jul 2008 14:09:16 -0400, Terry Reedy wrote:
> 
>>>>>>> g = lambda x:validate(x)
>> This is doubly diseased.
>>
>> First, never write a 'name = lambda...' statement since it is equivalent
>> to a def statement except that the resulting function object lacks a
>> proper .funcname attribute.
> 
> Using lambda in this way is no more "diseased" than aliasing any other 
> object.

In the context of giving advice to a confused beginner, I disagree.
He must learn def statements.  Lambda expressions are optional.

 > It's a matter of personal preference not to bind a lambda to a
> name. Functions, whether created by lambda or def, are first class 
> objects, and as such there's nothing wrong with binding them to names.

When I brought this up on pydev, in the context of a style guide 
addition, about 9 of 10 respondants agreed that this should be 
discouraged.  Alex Martelli reported his experience that this 
construction more often leads people to the useless wrapping of function 
calls, such as the OP posted, than the def statement equivalent does.

One of the major reasons people give for wanting lambda expressions kept 
in Python and for using them is that they do not want to have to think 
up a name for short expressions.  If such a person then turns around and 
  binds the resulting function object to a name, then that rationale 
disappears.

Over the years, people have written on c.l.p about 'lambdas' as if they 
were a separate class of objects somehow different from def objects (and 
  not just an expression).  I believe writing and reading both 'name = 
lambda ...' and 'def name(...' engenders and reinforces this delusion, 
especially for beginners.

> Admittedly, the lack of a func_name attribute can sometimes make 
> tracebacks harder to understand, especially if you've got many bound 
> lambdas.

Is saving two keystrokes worth that disadvantage, and the confusions 
mentioned above?  To me, no.  Hence my advice.

Terry Jan Reedy




More information about the Python-list mailing list