Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python : recursion loop in rich comparison operator

I did not understand where is the logic in my bug, so I managed to find a minimal example. I defined one class t, and said that something happens when you use the <= operator and that a>=b must compute b<=a. It works fine

Then I derived a subclass u from t. When I compare two values, if they are both from t or both from u it works as expected, but if one is from class u and another from class t it fails. Why ??

class t :
    def __le__(self,other) : return True
    def __ge__(self,other) : return(other<=self)
class u(t) :
    pass

a=t()
b=u()
#works
a<=a
a>=a
b<=b
b>=b
#works
a>=b
b<=a
#doesn't work RuntimeError: maximum recursion depth exceeded
a<=b
b>=a

EDIT : There is no problem in python 2.x (from tobias_k), but I want to use python 3.3 at least

like image 257
Xoff Avatar asked Mar 30 '14 08:03

Xoff


1 Answers

When you do a <= b and b is an instance of a subclass of a's class, Python will first call b.__ge__('a') (and then try other methods if this call returns NotImplemented)

Here is how to implement it without infinite recursion:

>>> class t:
...     def __le__(self, other):
...         return True
...     def __ge__(self, other):
...         return NotImplemented
... 
>>> class u(t):
...     pass
...
like image 98
Valentin Lorentz Avatar answered Nov 03 '22 07:11

Valentin Lorentz