Как реализован True ‹ 2?

Он не реализован непосредственно в bool.

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

И это, по-видимому, не реализовано и на int:

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

Не существует отраженной версии __lt__ для 2 для управления операцией, а поскольку тип int не является подклассом bool, он в любом случае никогда не будет работать.

Python 3 ведет себя так, как ожидалось:

>>> True.__lt__(2)
True

Итак, как True < 2 реализовано в Python 2?


person wim    schedule 04.11.2016    source источник
comment
Может быть, через неявное преобразование в целое число?   -  person Carcigenicate    schedule 05.11.2016
comment
Этот трюк может показаться вам забавным: [exprFalse, exprTrue][condition] эквивалентно exprTrue if condition else exprFalse.   -  person BlackBear    schedule 05.11.2016
comment
@BlackBear, за исключением того, что он оценивает оба. print("True") if condition else print("False") против [print("False"), print("True")][condition].   -  person user253751    schedule 05.11.2016


Ответы (3)


Вы не нашли super(bool, True).__lt__, потому что int использует устаревший метод __cmp__ вместо расширенных сравнений в Python 2. Это int.__cmp__.

person user2357112 supports Monica    schedule 04.11.2016

True равен 1 в Python (поэтому он меньше 2), а bool является подклассом int: по сути, False и True равны 0 и 1 с причудливыми repr().

Что касается того, как сравнение реализовано для целых чисел, Python использует __cmp__(), который является старым способом записи сравнений в Python. (Python 3 не поддерживает __cmp__(), поэтому он реализован там как __lt__().) См. https://docs.python.org/2/reference/datamodel.html#object.__cmp__

person kindall    schedule 04.11.2016
comment
Ах, да, это так. Я забыл о старом __cmp__. Спасибо! - person wim; 05.11.2016

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__, эквивалентные < и >.

person Community    schedule 05.11.2016
comment
True — это просто имя, которое относится к объекту типа int ‹— я не думаю, что это правильно, тип True — это bool. Подкласс int. Подкласс, в принципе, может переопределить операцию True < 2, чтобы она вел себя иначе, чем 1 < 2. - person wim; 05.11.2016