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 Cheers, Jacob Rus