What is in hindsight a foolish way to do generator expressions |
March 5th, 2009 |
programming, python, tech |
if x.startswith("foo") for all x in a_list: ... if is_verb(leaf) for some leaf in a_tree: ...I usually end up coding these a bunch of different ways, the shortest of which are:
if False not in [x.startswith("foo") for x in a_list]: ... if True in [is_verb(leaf) for leaf in a_tree]: ...But these don't short circut and are ugly. Sometimes I'll write little funtions but I don't like that either. Currently the syntax
if [expr] for ...
doesn't mean anything, so this
should be possible. I wonder if it would be worth writing a PEP.
Update 3/6/2009: George Dahl writes that python already does this. I should be writing those examples as:
if all(x.startswith("foo") for x in a_list): ... if any(is_verb(leaf) for leaf in a_tree): ...These examples use generator expressions instead of list comprehensions. And builtins
any
and all
. Especially as one can use any
function, not just any
or all
, this is a much
nicer syntax than what I wanted. It doesn't read as fluidly as
english, but then again it doesn't deal with these two specific
case as special cases of the if statement. So I'm quite happy.
The only other real downside is also I think the reason I didn't end up with this when fiddling around at the python prompt: you need somewhat non-intuitive parens. I'm pretty sure when I was trying to see if there was a way to do what I wanted I did:
>>> x for x in range(7) File "<stdin>", line 1 x for x in range(7) ^ SyntaxError: invalid syntaxAnd then moved on. As a human I don't see an obvious reason why I can't enter the obvious thing. Is there something else a statement beginning with "
x for
" could mean?
Comment via: facebook