Looking into Queue.py in Python 2.6, I found this construct that I found a bit strange:
def full(self):
"""Return True if the queue is full, False otherwise
(not reliable!)."""
self.mutex.acquire()
n = 0 < self.maxsize == self._qsize()
self.mutex.release()
return n
If maxsize
is 0 the queue is never full.
My question is how does it work for this case? How 0 < 0 == 0
is considered False?
>>> 0 < 0 == 0
False
>>> (0) < (0 == 0)
True
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
I believe Python has special case handling for sequences of relational operators to make range comparisons easy to express. It's much nicer to be able to say
0 < x <= 5
than to say(0 < x) and (x <= 5)
.These are called chained comparisons. And that's a link to the documentation for them.
With the other cases you talk about, the parenthesis force one relational operator to be applied before the other, and so they are no longer chained comparisons. And since
True
andFalse
have values as integers you get the answers you do out of the parenthesized versions.As other's mentioned
x comparison_operator y comparison_operator z
is syntactical sugar for(x comparison_operator y) and (y comparison_operator z)
with the bonus that y is only evaluated once.So your expression
0 < 0 == 0
is really(0 < 0) and (0 == 0)
, which evaluates toFalse and True
which is justFalse
.I'm thinking Python is doing it's weird between magic. Same as
1 < 2 < 3
means 2 is between 1 and 3.In this case, I think it's doing [middle 0] is greater than [left 0] and equal to [right 0]. Middle 0 is not greater than left 0, so it evaluates to false.
Here it is, in all its glory.
The strange behavior your experiencing comes from pythons ability to chain conditions. Since it finds 0 is not less than 0, it decides the entire expression evaluates to false. As soon as you break this apart into seperate conditions, you're changing the functionality. It initially is essentially testing that
a < b && b == c
for your original statement ofa < b == c
.Another example:
maybe this excerpt from the docs can help:
These were comparisons but since you are chaining comparisons you should know that: