[Python-3000] Need closure on __cmp__ removal
hashcollision
hashcollision at gmail.com
Tue Jan 8 23:34:39 CET 2008
Ok, I do see your point, but how would one pass in a custom comparison
function to sorted?
On Jan 7, 2008 11:55 PM, Guido van Rossum <guido at python.org> wrote:
> On Jan 7, 2008 8:48 PM, hashcollision <hashcollision at gmail.com> wrote:
> >
> >
> > > But the biggest thing missing is precise semantics. Saying "exactly
> > > the same semantics as with Python 2.5" doesn't cut it (those semantics
> > > are incredibly hairy and sometimes surprising, and their
> > > implementation was a nightmare -- I've rarely been as relieved as when
> > > I was able to cut those out of the implementation).
> >
> >
> > Why is that so? I might be being naive, but what is wrong with something
> > like this:
> >
> > def cmp(a, b):
> > if hasattr(a, '__cmp__'):
> > return a.__cmp__(b)
> > elif hasattr(b, '__cmp__'):
> > return -1 * b.__cmp__(a)
> > elif hasattr(a, '__le__') and hasattr(a, '__ge__'):
> > x = a <= b
> > y = a >= b
> > if x and y:
> > return 0
> > elif x:
> > return -1
> > elif y:
> > return 1
> > elif hasattr(b, '__le__') and hasattr(b, '__ge__'):
> > x = b <= a
> > y = b >= a
> > if x and y:
> > return 0
> > elif x:
> > return 1
> > elif y:
> > return -1
> > elif hasattr(a, '__eq__'):
> > if a == b:
> > return 0
> > if hasattr(a, '__lt__'):
> > if a < b:
> > return -1
> > else:
> > return 1
> > elif hasattr(a, '__gt__'):
> > if a > b:
> > return 1
> > else:
> > return -1
> > else:
> > raise NotImplemented()
> > elif hasattr(b, '__eq__'):
> > if a == b:
> > return 0
> > if hasattr(b, '__lt__'):
> > if b < a:
> > return 1
> > else:
> > return -1
> > elif hasattr(b, '__gt__'):
> > if b > a:
> > return -1
> > else:
> > return 1
> > else:
> > raise NotImplemented()
> > else:
> > raise NotImplemented()
>
> You don't call that hairy? :-)
>
> Anyway, one of the additional complications is that it is supposed to
> be implemented in C, and there is one C slot for all six comparisons
> together (which of the six is an argument). The 2.x rules are also
> further complicated in that sometimes the RHS is tried before the LHS
> (in case the RHS is an instance of a subclass of the class of the
> LHS).
>
> And I think you've ignored the possibility that a.__cmp__(b) might
> return NotImplemented.
>
> Just believe me, it's hairy.
>
> --
> --Guido van Rossum (home page: http://www.python.org/~guido/)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-3000/attachments/20080108/ad438144/attachment.htm
More information about the Python-3000
mailing list