On Mon, Jan 25, 2010 at 15:30, Nick Coghlan <ncogh...@gmail.com> wrote:
> Ah, you mean the case where both classes implement the recipe, but know
> nothing about each other and hence both return NotImplemented from their
> root comparison?

Well, only one needs to return NotImplemented, actually.

> OK, that sounds like a plausible real world problem with the recipe, but
> I'm not sure how difficult it would be to fix.

I've failed. :-) I currently something like this instead:

class ComparableMixin(object):
    def __lt__(self, other):
        try:
            return self.__cmp__(other) < 0
        except TypeError:
            return NotImplemented

    def __le__(self, other):
        try:
            return self.__cmp__(other) <= 0
        except TypeError:
            return NotImplemented

    def __gt__(self, other):
        try:
            return self.__cmp__(other) > 0
        except TypeError:
            return NotImplemented

    def __ge__(self, other):
        try:
            return self.__cmp__(other) >= 0
        except TypeError:
            return NotImplemented

    def __eq__(self, other):
        try:
            return self.__cmp__(other) == 0
        except TypeError:
            return NotImplemented

    def __ne__(self, other):
        try:
            return self.__cmp__(other) != 0
        except TypeError:
            return NotImplemented

That does rely on a (deprecated) __cmp__ but it will never be  called
directly anyway.
The __cmp__ is then implemented something like this:

            def __cmp__(self, other):
                try:
                    return (self.v > other.v) - (self.v < other.v)
                except AttributeError:
                    raise TypeError('Can not compare %s and %s' %
(type(self), type(other))

Since this doesn't "redirect" any of the __xx__ methods to another
one, the problem goes away.
But it uses a lot of annoying try/excepts. Ideas for improvements would be nice.

-- 
Lennart Regebro: http://regebro.wordpress.com/
Python 3 Porting: http://python-incompatibility.googlecode.com/
+33 661 58 14 64
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to