[Python-ideas] Calling a function of a list without accumulating results

Brett Cannon brett at python.org
Thu Sep 27 05:42:06 CEST 2007


On 9/26/07, Terry Jones <terry at jon.es> wrote:
> Hi Brett
>
> | > The first is the same as one of the arguments for providing list
> | > comprehensions and generator expressions - because it makes common
> | > multi-line boilerplate much more concise.
> |
> | OK, the question is how common is this.
>
> I don't know. I use it maybe once every few weeks. There's a function to do
> this in Common Lisp (mapc), not that that means anything much.
>

You could try to get something that consumes a generator that just
tosses out the results into the stdlib.  That has a much lower barrier
of entry than new syntax.

> | But are you sure Python's grammar could support it?  Parentheses are
> | needed for genexps in certain situations for disambiguation because of
> | Python's LL(1) grammar.
>
> I don't know the answer to this either. I imagine it's a matter of tacking
> an optional "for ..." clause onto the end of an expression. The "for ..."
> part can certainly be handled (is being handled already), so I think it
> might not be too hard - supposing there is already a non-terminal for the
> "for ..." clause.
>
> | > The trivial case I posted isn't much of a win over the simple 2-line
> | > alternative, but it's easy to go to further:
> | >
> | >     f(x, y) for x in myXlist for y in myYlist
> | >
> | > instead of
> | >
> | >     for x in myXlist:
> | >         for y in myYlist:
> | >             f(x, y)
> | >
> | > and of course there are many more examples.
> |
> | Right, but the second one is so much easier to read and comprehend.
>
> I tend to agree, but the language supports the more concise form for both
> list comprehension and genexps, so there must be a fair number of people
> who thought it was a win to allow the compact form.
>

Yes, but it was specifically for the list building idiom.

> | I think "force" is rather strong wording for "choice".
>
> OK, how about "lack of choice"?  :-)
>
> Seriously (to take an example from the Python pocket ref page 24), you do
> have the choice to write
>
>     a = [x for x in range(5) if x % 2 == 0]
>
> instead of
>
>     a = []
>     for x in range(5):
>         if x % 2 == 0:
>             a.append(x)
>
> but you don't have a (simple) choice if you don't want to accumulate
> results.  I'm merely saying that I think it would be cleaner and more
> consistent to allow
>
>     print(x) for x in range(5) if x % 2 == 0
>
> instead of having the non-choice but to write something like
>
>     for x in range(5):
>         if x % 2 == 0:
>             print x
>
> Yes, I (and thank you for it) could now use your suggested for _ in ...:
> pass trick, but that's not really the whole point, to me. If the language
> can be made simpler and more consistent, I think that's generally a good
> thing.
>

But it could be said is not simpler as there is now a new type of
statement that previously was always an expression (this would have to
be a statement as the whole point of this idea is there is no return
value).

> I know, I don't know anything about the implementation. But this is an
> ideas list.
>

Right, which is why this conversation has gone on without someone
flat-out saying it wasn't going to happen like on python-dev.  =)  But
at some point the idea either needs to seem reasonable to enough to
try to move forward or to just let it go.  And at this point I have
said what it will take to take it to the next level if you care enough
as I doubt any of the core developers will go for this enough to carry
it on their own.

> | Heck, I would vote to ditch listcomps for ``list(genexp)`` had genexps
> | come first and have the options trimmed down even more.
>
> Me too. But even if that eventuated, I'd _still_ propose allowing the
> unadorned genexp, for the case where you don't want the results.
>
> | Basically, unless you can go through the stdlib and find all the
> | instances of the pattern you want to prove it is common enough to
> | warrant support it none of the core developers will probably go for
> | this.
>
> Understood.
>
> Thanks,

Welcome.  Thanks for bringing the idea up!

-Brett



More information about the Python-ideas mailing list