[Python-ideas] "While" suggestion

Jacob Rus jacobolus at gmail.com
Tue Jul 29 03:53:32 CEST 2008

Andrew Akira Toulouse wrote:
> Your counterpoint takes exception to the example rather than the suggestion.
> Say someone is going through a flat file with a large list of numbers, and
> they want to filter out all odd numbers, and stop once they encounter a 0
> value.  [...]
> [int(line) for line in file if evenP(int(line)) until int(line)==0 with
> open(filename) as file]
> Bam, one line to open the file, iterate through them, filter out unneeded
> entries, define the base case, and return value.
> Do you believe that this also abuses list comprehensions? If so, please
> explain your reasoning.
> There's nothing keeping a programmer from writing anything this syntax could
> do as a normal for loop, but neither is there anything stopping said
> programmer from using a for loop with ifs and breaks in place of a list
> comprehension.

Since you don't like for loops, what's wrong with:

     from itertools import takewhile

     with open(filename) as f:
         intlines = (int(line) for line in f if evenP(int(line)))
         result = list(takewhile(lambda x: x, intlines))

This is perfectly clear, not too much longer than your suggestion, and 
doesn't require adding large amounts of extra syntax to the language 
(though using a lambda for the identity function is a bit more verbose 
than I'd prefer).

Personally, I’d rather have this broken up than in one gigantic line 
that looks like:

     result = [int(line) for line in f if evenP(int(line))
               until int(line) == 0 with open(filename) as f]

As for:

>     tokenchecks = [token for regex,token in match_tok until regex.match(s)] 
>     return tokenchecks[-1]

This is much more readably expressed as:

for regexp, token in match_tok:
     if regexp.match(s):
         return token

Jacob Rus

More information about the Python-ideas mailing list