[Python-ideas] YAML (yet-another-multiline-lambda)

Antony Lee anntzer.lee at gmail.com
Tue Oct 22 21:00:16 CEST 2013


On Tuesday, October 22, 2013 5:39:03 AM UTC-7, Steven D'Aprano wrote:
>
> On Tue, Oct 22, 2013 at 03:10:29AM -0700, Antony Lee wrote: 
>
> > Specifically, I suggest that the "def" (and possibly the "class") 
> > keyword(s) may be used in an expression context, if immediately 
> surrounded 
> > by parentheses.   
>
> I don't think there is any need to allow class in an expression, since 
> we already have type(). 
>

I don't actually think that extending the "class" statement is that useful, 
but felt that given the similarity between class and def, I may as well 
mention it.  The main point here is really the "def" statement.

>
> > The indentation of the body of the function is given by 
> > the indentation of the first line after the def. 
>
> I presume that means you can't do this: 
>
> value = [1, 2, 3, (def spam(arg): do_this() 
>                         do_that() 
>                         ), 4, 5, 6] 
>
> I think I would be okay with that, since you can't do that with the def 
> statement either: 
>
> py> def spam(): do_this() 
> ...     do_that() 
>   File "<stdin>", line 2 
>     do_that() 
>     ^ 
> IndentationError: unexpected indent 
>

Yes, that is the intent. 

>
>
> I suppose, like the statement version, a single-line function body could 
> be inline: 
>
> value = [1, 2, 3, (def spam(arg): do_this()), 4, 5, 6] 
>
> which would then make lambda redundant. 
>
 
While TOOWTDI, I think it is somewhat agreed that lambda's syntax is a bit 
a kludge, so perhaps we should try to find a replacement.

>
> In each of your examples, you have the body indented further to the 
> right than the def. Is that mandatory, or would you allow something like 
> this? 
>
> value = [1, 2, 3, (def spam(arg): 
>     do_this() 
>     do_that() 
>     if condition(): 
>         do_something_else() 
>     ), 
>     4, 5, 6, 
>     ] 
>
> That is, relative to the def itself, the body is outdented. 
>

I would allow this on grounds of grammar simplicity (but perhaps strongly 
discourage it in a style guide). 

>
>
> I can't see any reason to justify prohibiting the above in the language, 
> although I'd probably frown upon it in style-guides. I think that should 
> be written as: 
>
> value = [1, 2, 3, 
>          (def spam(arg): 
>               do_this() 
>               do_that() 
>               if condition(): 
>                   do_something_else() 
>               ), 
>          4, 5, 6, 
>          ] 
>
> sort of thing. But I don't think that having the first indent be to the 
> left of the def should be prohibited. However, that can lead to some 
> pretty ugly, and misleading, constructions: 
>
> def spam(arg, func=(def ham(a, 
>                             x, 
>                             y, 
>                             z): 
>     fe(a) 
>     fi(x) 
>     fo(y) 
>     fum(z) 
>     ), 
>         ): 
>     ... 
>
>
> I'm not sure if there is a question buried in this, or just an 
> observation. I hardly ever miss having multi-line lambdas, and I fear 
> that they will make code harder to read and understand. 
>
>
> -- 
> Steven 
> _______________________________________________ 
> Python-ideas mailing list 
> Python... at python.org <javascript:> 
> https://mail.python.org/mailman/listinfo/python-ideas 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20131022/8271f775/attachment.html>


More information about the Python-ideas mailing list