重载__le__的多个应用程序中的操作顺序

时间:2015-07-17 00:03:05

标签: python

在python中我试图重新配置__le__运算符,以便将“比较”的变量链接到列表中

a> b> c应该给[a,b,c]

我试过这样做但是我得到了一些奇怪的行为,这取决于我是否在被比较的值之间包含括号。

class OpQue:
    def __init__(self,opA,opB):
        self.ops = [opA,opB]
    def __gt__(self,b): #self > b
        #print("gt OpQue")
        if isinstance(b,Operation):
            self.ops.append(b)
            return self
        elif isinstance(b,OpQue):
            self.ops.append(b.ops)
            return self
        else:
            raise ValueError
class Operation:
    def __gt__(self,b):#self > b
        if isinstance(b,Operation):
            return OpQue(self,b)
        elif isinstance(b,OpQue):
            b.ops.insert(0,b)
            return b
        else:
            return ValueError

a = Operation()
b = Operation()
c = Operation()

if __name__ == "__main__":
    tmp1 =  (a >  b  > c)
    print(" No brackets: ",len(tmp1.ops))
    tmp2 =  ( (a >  b)  > c)
    print(" Front brackets: ",len(tmp2.ops))
    tmp3 =  (a >  (b  > c))
    print(" Back brackets: ",len(tmp3.ops))

令我惊讶的是,这给出了以下结果:

 No brackets:  2
 Front brackets:  3
 Back brackets:  3

我希望没有括号的情况与其他情况相同,我错过了什么?

1 个答案:

答案 0 :(得分:0)

链式比较运算符被视为与它们之间的and成对完成。这是允许你写的东西:

if 1 <= x <= 10

测试x是否在110之间。 documentation说:

  

形式上,如果 a,b,c,...,y,z 是表达式而 op1,op2,...,opN 是比较运算符,那么a op1 b op2 c ... y opN z等同于a op1 b and b op2 c and ... y opN z,但每个表达式最多只评估一次。

重载操作符并不会改变这个特殊的解析规则。

所以当你写

tmp1 = (a > b > c)

它被评估为

tmp1 = (a > b and b > c)

这会将tmp1设置为b > c的结果,即[b, c]