I need to check if a function written by another team returns True
or None
.
I want to check for identity, not equality.
I'm unclear what type of check happens when using in
. Which of the following does if result in (True, None):
behave like?
if result is True or result is None:
if result or result == None:
No, they are not the same, because identity testing is a subset of what the in
operator does.
if result in (True, None):
Is the same as this:
if result == True or result is True or result == None or result is None:
# notice that this is both #1 and #2 OR'd together
From the docs:
For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression x in y is equivalent to any(x is e or x == e for e in y)
The in operator tests for both equality and identity, and either one being true will return True
. I got the impression that you're only working with boolean values and None
. In that limited case, the in
operator will behave the same as both of your other snippets.
However, you said you want identity checking. So I would suggest you use that explicitly so your code's intention and what it is expecting is clear. Furthermore, if there is a bug in the called function and it returns something other than boolean or None
, using the in
operator can hide that bug.
I would suggest your first alternative:
if result is True or result is None:
# do stuff
else:
# do other stuff
Or if you're feeling defensive:
if result is True or result is None:
# do stuff
elif result is False:
# do other stuff
else:
# raise exception or halt and catch fire