[Python-3000] Please re-add __cmp__ to python 3000
Adam Olsen
rhamph at gmail.com
Wed Oct 31 06:53:02 CET 2007
On 10/30/07, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
> Adam Olsen wrote:
> > for a, b in zip(self.data, other.data):
> > result = richcmp(a, b, ordered)
> > if result:
> > return result
>
> That can't be right, because there are *three* possible
> results you need to be able to distinguish from comparing
> a pair of elements: "stop and return True", "stop and
> return False", and "keep going". There's no way you can
> get that out of a boolean return value.
It's not strictly a boolean value.
If ordered is false then you interpret it as either a false value or a
true value (but it may return -1 or +1 for the true values.)
If ordered is true then it may be -1, 0/false, +1, or raise a
TypeError if ordering is unsupported.
> def __cmp__(self, other):
> for a, b in zip(self.items, other.items):
> result = cmp(a, b)
> if result != 0:
> return result
> return 0
>
> Which is actually the same as it is now, with an added
> bit of It Just Works behaviour: if any of the element
> comparisons gives UnequalButNotOrdered, then the whole
> sequence gets reported as such.
So the difference between our two approaches is that mine uses a flag
to indicate if a TypeError should be raised, while yours adds an extra
return value.
Mine does have a small benefit: list currently exits early if it's
only testing for equality and the lengths differ, which couldn't be
done with your API.
--
Adam Olsen, aka Rhamphoryncus
More information about the Python-3000
mailing list