有没有办法让Python运算符行“==”和“>”返回int而不是bools。我知道我可以使用int函数(int(1 == 1)
)或添加0((1 == 1) + 0
),但我想知道是否有一种简单的方法可以做到这一点。就像你希望除法返回浮点数一样,你可以输入from __future__ import division
。有没有办法让运营商返回整数?或者我可以创建一个扩展__future__._Feature
的课程来完成我想要的工作吗?
答案 0 :(得分:3)
您无法覆盖内置比较功能。在某种意义上,比较运算符已经返回int
。 bool
是int
的子类,因此您可以对int执行任何操作。那么问题就变成为什么你想要比较返回int对象,而不是bool对象?
答案 1 :(得分:1)
您可以让自定义类的比较运算符返回您喜欢的任何内容 - 只需实现相关方法(__eq__
,__ne__
,__gt__
,__lt__
,{ {1}},__ge__
)返回您想要的内容。对于您无法控制的对象,您无法更改此设置,但由于the Liskov substitution principle,因此不需要:bools 是整数。注意到内置类型'__le__
方法返回的bool与任何其他整数之间的差异的代码使用错误的结果。
__eq__
模块与此无关;你不能用它做任何你想做的事情,你只能用它来改变添加到Python的特定设置。您可以使用__future__
导入将除法转换为真正的除法,因为这是添加到Python的内容。添加更多__future__
导入的唯一方法是修改Python本身。
答案 2 :(得分:1)
根据您的说明,您可以将比较运算符更改为:
stack.push(1 if stack.pop() > stack.pop() else 0)
这会根据您的意愿将>
的布尔结果转换为1
或0
。
另外,请注意在同一表达式中调用stack.pop()
两次。你不知道(肯定)将评估参数的顺序,Python的不同实现可能会以不同的顺序弹出参数。您将需要使用临时变量:
x = stack.pop()
y = stack.pop()
stack.push(1 if x > y else 0)
答案 3 :(得分:1)
在您自己的对象上,很容易覆盖每个比较运算符。对于内置函数,覆盖方法是“只读”,因此我设置它们的所有尝试都不会成功。
>>> class foo:
def __lt__(self, other):
return cmp(5, other)
>>> f = foo()
>>> f<3
1
>>> f<7
-1
>>> f<5
0
>>> j=""
>>> j.__lt__=lambda other: cmp(5, other)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'str' object attribute '__lt__' is read-only
答案 4 :(得分:0)
将你的bool转换为int?
>>> int(True)
1
>>> int(False)
0
或者把它投到str?
>>> str(int(True))
'1'
>>> str(int(False))
'0'
答案 5 :(得分:0)
抱歉,我找不到邮件列表帖子。我记得它,因为它非常有趣。