On Jan 8, 2008 2:41 PM, Guido van Rossum <[EMAIL PROTECTED]> wrote: > list.sort() and built-in sorted() are the least of our problems: even > though the API uses cmp, the implementation actually only ever uses > '<'; and the preferred API is to use the 'key' argument instead of > passing a compare function; that's much more efficient. > > Maybe we should retire the compare function completely in 3.0? >
+1 from me. I personally have always hated the whole, -1, 0, 1 style of comparison anyway. -Brett > > On Jan 8, 2008 2:34 PM, hashcollision <[EMAIL PROTECTED]> wrote: > > 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 <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > On Jan 7, 2008 8:48 PM, hashcollision <[EMAIL PROTECTED]> 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/) > > > > > > > > > > > -- > --Guido van Rossum (home page: http://www.python.org/~guido/) > > _______________________________________________ > Python-3000 mailing list > Python-3000@python.org > http://mail.python.org/mailman/listinfo/python-3000 > Unsubscribe: > http://mail.python.org/mailman/options/python-3000/brett%40python.org > _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com