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/ -- https://mail.python.org/mailman/listinfo/python-list