Python运算符返回整数

时间:2010-05-05 23:05:02

标签: python operators int boolean

有没有办法让Python运算符行“==”和“>”返回int而不是bools。我知道我可以使用int函数(int(1 == 1))或添加0((1 == 1) + 0),但我想知道是否有一种简单的方法可以做到这一点。就像你希望除法返回浮点数一样,你可以输入from __future__ import division。有没有办法让运营商返回整数?或者我可以创建一个扩展__future__._Feature的课程来完成我想要的工作吗?

6 个答案:

答案 0 :(得分:3)

您无法覆盖内置比较功能。在某种意义上,比较运算符已经返回intboolint的子类,因此您可以对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)

这会根据您的意愿将>的布尔结果转换为10

另外,请注意在同一表达式中调用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)

不,你不能。当Guido统一类型和类时,他找到了一种方法来覆盖内置类型的行为(由于他实现事物的方式),但他宣称它是一个bug并堵塞了漏洞。改变内置类型的行为(除了你的例子 - 从未来导入除法,这是有充分理由的)是禁止的。

抱歉,我找不到邮件列表帖子。我记得它,因为它非常有趣。