Все это допустимые утверждения (и все они оцениваются как True
):
0 < True
0 < 1.
0. < True
{0} < frozenset((0, 1))
Единственное, что может показаться странным, это то, что 0. == False
и 1. == True
.
С другой стороны, вы все равно можете воспроизвести то, что делает Python 2, приведя свое значение к str
перед его сравнением (это также оценивается как True
):
str(5) < 'hello'
Если вам действительно нужноТакое поведение вы всегда можете иметь функцию, которая будет приведение / сравнение.Таким образом, вы гарантируете, что объекты разных типов всегда будут сравниваться одинаково, что является единственным ограничением в python 2.
def lt(a, b):
return str(a) < str(b)
Или, может быть, даже лучше, вы можете приводить только при необходимости:
def lt(a, b):
try:
return a < b
except TypeError:
return str(a) < str(b)
С другой стороны, как предлагается в комментариях, в реализации CPython сравнение выглядит следующим образом:
def lt(a, b):
try:
return a < b
except TypeError:
if a is None:
return True
if b is None:
return False
if isinstance(a, numbers.Number):
return True
if isinstance(b, numbers.Number):
return False
return str(type(a)) < str(type(b))