checking if two things do not equal None
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Sun Mar 30 02:08:37 EDT 2014
On Sat, 29 Mar 2014 19:54:09 -0700, Rustom Mody wrote:
> On Sunday, March 30, 2014 8:09:45 AM UTC+5:30, Roy Smith wrote:
>> I have no particular problem with
>
>> x < 2 < y
>
>> because it fits the same pattern. But, if you show me
>
>> a != None != b:
>
>> my brain just goes into overload. Honestly, I don't even know what
>> that means. My brain keeps trying to stick a, None, and b on Mrs.
>> Albaum's number line and keeps walking into the wall. If you (the
>> editorial you) tell me that my failure to grok that expression means
>> I'm not fluent in Python, well then, guilty as charged.
>
> <Math Terminology>
[...]
> So for != chained comparisons are not natural (or IMHO appropriate)
I tend to agree they're "not natural", although appropriate is another
thing. The problem is that we tend to read something like:
a != b != c
as "all of a, b and c are unequal", corresponding to:
a == b == c
as "all of a, b and c are equal". But that's not what it means. It means
that a != b and b != c, but it says nothing about a and c. And that was
my mistake. The OP actually got it right in their first post, but
sticking None in the middle to ensure it partakes of both comparisons.
a is not None is not b
Still, that's not easily extended to a third item, this would be wrong:
a is not None is not b is not c
since c only gets compared against b, not None. Better is to factor the
"not" out:
not (a is b is c is None)
which now should be clear: you're testing whether or not *all* of a, b
and c are None. If you prefer:
not all(x is None for x in (a, b, c))
Which is more readable is a matter of personal preference.
I think Johannes got it right: boolean logic is easier to reason about
when there is a minimum of "not"s.
--
Steven D'Aprano
http://import-that.dreamwidth.org/
More information about the Python-list
mailing list