25

I want to determine if a list contains a certain string, so I use a generator expression, like so:

g = (s for s in myList if s == myString)
any(g)

Of course I want to inline this, so I do:

any((s for s in myList if s == myString))

Then I think it would look nicer with single parens, so I try:

any(s for s in myList if s == myString)

not really expecting it work. Surprise! it does!

So is this legal Python or just something my implementation allows? If it's legal, what is the general rule here?

2 Answers 2

25

It is legal, and the general rule is that you do need parentheses around a generator expression. As a special exception, the parentheses from a function call also count (for functions with only a single parameter). (Documentation)

Note that testing if my_string appears in my_list is as easy as

my_string in my_list

No generator expression or call to any() needed!

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for the answer. my_string in my_list was the first thing I tried, but it failed to find a string that was present. I concluded that it was doing object comparison rather than value comparison, which is what I need. I'll check again.
@Ari: No, it does value comparison. I don't know what went wrong in your case.
3

It's "legal", and expressly supported. The general rule is "((x)) is always the same as (x)" (even though (x) is not always the same as x of course,) and it's applied to generator expressions simply for convenience.

4 Comments

Just to clarify, x is not a place holder for just anything here. f((a, b)) is of course different from f(a, b).
Yes, indeed, it's a placeholder for a single expression.
Can you provide a reference for this rule (that ((x)) is always the same as (x) )?
@Ari: See here: "A parenthesized expression list yields whatever that expression list yields." This usually doesn't apply to the parens in function calls, though -- it is a special exception for generator expressions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.