[Python-ideas] BUG in standard while statement

Andrew Barnert abarnert at yahoo.com
Fri Sep 11 00:34:29 CEST 2015

On Sep 10, 2015, at 12:04, Chris Barker <chris.barker at noaa.gov> wrote:
> However, I've found myself wanting a "make nothing comprehension". For some reason, I find myself frequently following a pattern where I want to call the same method on all the objects in a sequence:
> for obj in a_sequence:
>     obj.a_method()
> but I like the compactness of comprehensions, so I do:
> [obj.a_method() for obj in a_sequence]

I think this is an anti-pattern. The point of a comprehension is that it's an expression, which gathers up results. You're trying to hide side effects inside an expression, which is a bad thing to do, and lamenting the fact that you get a useless value back, which of course you do because expressions have values, so that should be a sign that you don't actually want an expression here.

Also, compare the actual brevity here:

    [obj.a_method() for obj in a_sequence]
    for obj in a_sequence: obj.a_method()

You've replaced a colon with a pair of brackets, so it's actually less concise.

If you really want to do this anyway, you can use the consume recipe from the itertools docs or the more-itertools library or write your own one-liner:

    consume = partial(deque, maxlen=0)
    consume(obj.a_method() for obj in a_sequence)

At least this makes it explicit that you're creating and ignoring a bunch of values. But I still think it's much clearer to just use a for statement.

More information about the Python-ideas mailing list