Overloading operators on the rigth.

Bengt Richter bokr at oz.net
Tue Oct 12 21:07:35 EDT 2004


On Tue, 12 Oct 2004 16:06:52 +0200, aleaxit at yahoo.com (Alex Martelli) wrote:

>denis wendum <wendum.denis at pasdepourriels.edf.fr> wrote:
>
>> But my guess to define the method __rlt__ in my class in order to be
>> able to evaluate expressions "non_instance < instance" did not work.
>
>Sensible guess, but not the way things work.
>
>> So what are the names (if they exist at all) of the comparison operators
>> <,>,== and so on,  when one wants to exend their rigth hand side to a
>> user defined (instance of a) class?
>
>Here's how to find out:
>
>>>> class foo:
>...   def __getattr__(self, name):
>...     print 'looking for %r' % name
>...     raise AttributeError, name
>... 
>>>> f=foo()
>>>> 12 < f
>looking for '__gt__'
>looking for '__coerce__'
>looking for '__cmp__'
>True
>>>> 
>
>See what's happening here?  After determining that int (the type of 12)
>cannot deal with comparing 12 with an instance of foo, Python's
>implementation of < turns to the right hand side... and asks for a
>__gt__ method first!  Makes sense, because 12 < f is presumably going to
>be the same thing as f > 12 ... once it doesn't find __gt__ the
>implementation continues by trying to coerce f to an int (by checking if
>class foo supports __coerce__) and lastly by trying for the old-style
>comparison method __cmp__.  But you presumably don't care about that;
>rather, the gist of it is: write your __gt__ -- that will also be used
>as your "__rlt__" -- and so on!
>

On my system, (NT4, python 2.3.2) what really happens for newstyle classes
isn't apparent from that experiment:

 >>> class foo(object):
 ...   def __getattr__(self, name):
 ...     print 'looking for %r' % name
 ...     raise AttributeError, name
 ...
 >>> f=foo()
 >>> 12 < f
 True

The old style does work much the same (but note the default end result ;-)
Is that a 2.3.2 bug?

 >>> class foo:
 ...   def __getattr__(self, name):
 ...     print 'looking for %r' % name
 ...     raise AttributeError, name
 ...
 >>> f=foo()
 >>> 12 < f
 looking for '__gt__'
 looking for '__coerce__'
 looking for '__cmp__'
 False

Regards,
Bengt Richter



More information about the Python-list mailing list