如何实现 True < 2?

24

它并没有直接实现在bool上。

>>> True.__lt__(2)
AttributeError: 'bool' object has no attribute '__lt__'

而且显然也没有在 int 上实现:

>>> super(bool, True).__lt__(2)
AttributeError: 'super' object has no attribute '__lt__'

对于控制操作的 2,没有 __lt__ 的反射版本,并且由于 int 类型不是 bool 的子类,因此这永远不会起作用。

Python 3 的表现如预期:

>>> True.__lt__(2)
True

那么,在Python 2中,True < 2是如何实现的呢?


可能通过隐式转换为整数实现? - Carcigenicate
你可能会觉得这个技巧很有趣:[exprFalse, exprTrue][condition] 等同于 exprTrue if condition else exprFalse - BlackBear
4
除了同时评估两者外,它们是等价的。print("True") if condition else print("False")[print("False"), print("True")][condition] - user253751
3个回答

50

True在Python中等于1(因此小于2),而boolint的子类:基本上,FalseTrue分别是具有奇怪的repr()的0和1。

至于Python如何实现整数比较,它使用__cmp__(),这是在Python中编写比较的老式方法。(Python 3不支持__cmp__(),因此在那里它被实现为__lt__()。)请参见https://docs.python.org/2/reference/datamodel.html#object.__cmp__


2
啊,是的,就是这个。我忘记了老的__cmp__。谢谢! - wim

24

你没有找到super(bool, True).__lt__是因为在Python 2中,int使用遗留的__cmp__方法而不是富比较。正确的写法应该是int.__cmp__


0

True只是指向一个类型为int的对象,具体为值1。表达式True < 2等于1 < 2。同样地,False等于0。在Python 2中,您有一个名为__cmp__的方法,如果值相等则返回0,如果一个值比另一个值大,则返回-1,并且如果一个值比另一个值小,则返回1。例如:

>>> True.__cmp__(1)
0
>>> True.__cmp__(0)
1
>>> True.__cmp__(-1)
1
>>> True.__cmp__(0)
1
>>> True.__cmp__(1)
0
>>> True.__cmp__(2)
-1

在Python 3中,你有一个__lt____gt__方法,它们相当于<>

2
“True”只是一个名称,指的是一种类型为“bool”的对象。这个子类继承了“int”,理论上可以覆盖运算符“True < 2”以使其与“1 < 2”不同。 - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接