在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
我希望没有括号的情况与其他情况相同,我错过了什么?
答案 0 :(得分:0)
链式比较运算符被视为与它们之间的and
成对完成。这是允许你写的东西:
if 1 <= x <= 10
测试x
是否在1
和10
之间。 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]
。