I sing the praises of lambda, my friend and savior!

Steven Bethard steven.bethard at gmail.com
Mon Oct 11 12:58:27 EDT 2004


Clark C. Evans wrote:
>    def somerandomname(args):
>        body
>    func(arg, somerandomname)
> 
> So, you've taken something that is a perfectly clear one-liner and
> converted it into a 3 line chunk of code with _zero_ added clarity,
> in fact, I'd say you've dramatically reduced clarity by requiring
> the a name be 'minted'.

The argument that was given to me is that, if I wrote my def statement as a 
general enough function, I could reuse the function at multiple points in the 
code.  This was mostly true for me, but there are some styles of code that I 
don't write too much (e.g. event-driven) so I can imagine that this might not 
be as applicable to others...

> | Well, if lambda is removed (or not , I hope an anonymous def 
> | expression is allowed, so we can write
> | 
> |    obj.f = def(args):
> |                body
> | or
> | 
> |    obj.f = def(args): body
> | 
> | or
> | 
> |    obj.f = (
> |        def(args):
> |            body
> |    ) 
> 
> Ewww.  How is this better than lambda? Let's keep lambda, no?

While I totally agree with the Ewww here, I think the point was to have full-
fledged anonymous functions, instead of lambdas, which are restricted to a 
single expression.  Of course, the syntax chosen for this is (to some degree, 
at least) arbitrary, but the idea would be to allow things like:

func(arg1, lambda arg2:
               self.update(arg2)
               return arg2*2)

My understanding is that no one's ever found an anonymous def syntax that 
everyone really likes, so I suspect the argument will continue to be "too ugly 
for too little gain in coding ease".  Especially since as soon as you really 
do need a multiline def, it only costs you one line to declare the function 
normally, and you don't get funny indentation:

def foo(arg2):
    self.update(arg2)
    return arg2*2
func(arg1, foo)

Steve




More information about the Python-list mailing list