From python-list Thu Oct 20 11:24:30 2005 From: Toby Dickenson Date: Thu, 20 Oct 2005 11:24:30 +0000 To: python-list Subject: Re: Would there be support for a more general cmp/__cmp__ Message-Id: <200510201224.30934.tdickenson () devmail ! geminidataloggers ! co ! uk> X-MARC-Message: https://marc.info/?l=python-list&m=112980749415769 On Thursday 20 October 2005 11:53, Steve Holden wrote: > Personally I'm still not convinced that your requirement reflects a > substantial use case (but then I'm getting used to that ;-). Just > because an ordering is partial that doesn't mean that two instances of a > class shouldn't be compared. C++ has a cmp template function which can be implemented to define a total ordering for one type. This can be reliably used by implementations of ordered tree containers (for example) so that this container template class can only be instantiated for holding types that provide this comparison template function. One disadvantage is that these template container classes can only hold one type. ZODB's BTrees work in a similar way but use the regular python comparison function, and the lack of a guarantee of a total ordering can be a liability. Described here in 2002, but I think same is true today: http://mail.zope.org/pipermail/zodb-dev/2002-February/002304.html A BTree might contain two objects that are incomparable. That is, they raise an exception when compared. However the user will not know this if by coincidence the BTree implementation has never needed to compare these two objects. Now removing a third object from the container such that these two incomparable objects are adjacent in the BTree. There is a possibility that an exception might be raised when *reading* content from the BTree, since the BTree implementation now might need to compare this pair of objects. > What would you have Python do when the programmer tries to perform an > invalid comparison (i.e. what are the exact semantics imposed when > __cmp__() returns None/raises an exception)? Its too late to handle this by the time a specific comparison method of an individual object is being called. If you need a total ordering across a domain of objects then you need to involve some representation of that domain as a whole. -- Toby Dickenson -- http://mail.python.org/mailman/listinfo/python-list