This map-then-filter shortcoming is one of the most common warts I encounter with python syntax, and I would absolutely love an improvement here. I think ChrisA is closest with:
I'm really not liking the proposed syntax, but maybe there's an alternative. My first thought on reading this proposal is: "Ah, it's like SQL's 'HAVING' keyword". The trouble is that SQL can identify its columns, but Python doesn't have an easy syntax for "the thing you're about to return". Something like:
[abs(x) for x in numbers having _ > 5]
But I wonder, why not just:
[abs(x) for x in numbers if _ > 5]
Where _ refers to the return expression within a comprehension, and is
interpreted specially in this context?
On Tue, Mar 8, 2016 at 7:20 AM, Chris Angelico
On Wed, Mar 9, 2016 at 1:59 AM, Émanuel Barry
wrote: I’m going be confused by what sort of name binding it does. A quick glance at the keywords list tells me that no currently-existing keyword is “the obvious choice” for this purpose. I don’t think such a small niche warrants a new keyword, either.
Maybe a pseudo-keyword would be sufficient - comprehension/genexp syntax is pretty solidly specified, so it's less likely to break stuff than in general syntax.
I'm really not liking the proposed syntax, but maybe there's an alternative. My first thought on reading this proposal is: "Ah, it's like SQL's 'HAVING' keyword". The trouble is that SQL can identify its columns, but Python doesn't have an easy syntax for "the thing you're about to return". Something like:
[abs(x) for x in numbers having _ > 5]
The semantics would be equivalent to: def <listcomp>(): result = [] for x in numbers: _ = abs(x) if _ > 5: result.append(_) return result
A 'having' clause (and, by the way, I'm not too enthused about the name, but I'm using it as a placeholder because of SQL's use) would have to go after all 'for' and 'if' clauses, and would have access to one special name (maybe _ because of its use in interactive mode, or maybe something else) which holds the value that would be returned. A simple filter-out-the-false-ones could do this:
[regex.match(line) for line in lines having _]
Of course, people could just switch from 'if' to 'having' across the board, but this has the same consequences that it does in SQL: now *every* row has to be fully processed, only to be discarded at the last step. Using 'having' with no underscore would violate common sense and good style.
ChrisA _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/