python:富比较运算符中的递归循环

时间:2014-03-30 08:45:20

标签: python python-3.x operators

我不明白我的bug中的逻辑在哪里,所以我设法找到了一个最小的例子。我定义了一个类t,并说当你使用< =运算符并且> = b必须计算b< = a时会发生一些事情。 它工作正常

然后我从u派生了一个子类t。 当我比较两个值时,如果它们来自t或来自u两者,则它按预期工作,但如果一个来自类u而另一个来自类t它失败。 为什么 ??

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
编辑:python 2.x(来自tobias_k)没有问题,但我想至少使用python 3.3

1 个答案:

答案 0 :(得分:6)

执行a <= b并且ba类的子类的实例时,Python将首先调用b.__ge__('a')(然后尝试其他方法如果此调用返回NotImplemented

以下是如何在没有无限递归的情况下实现它:

>>> class t:
...     def __le__(self, other):
...         return True
...     def __ge__(self, other):
...         return NotImplemented
... 
>>> class u(t):
...     pass
...