Python 2.x позволяет сравнивать гетерогенные типы.
Полезный ярлык (в Python 2.7 здесь) заключается в том, что None
сравнивается меньше любого целого или плавающего значения:
>>> None < float('-inf') < -sys.maxint * 2l < -sys.maxint
True
И в Python 2.7 пустой кортеж ()
является бесконечным значением:
>>> () > float('inf') > sys.maxint
True
Этот ярлык полезен, когда можно сортировать смешанный список int и float и вы хотите иметь абсолютный минимум и максимум для ссылки.
Этот ярлык был удален в Python 3000 (это Python 3.2):
>>> None < 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()
Кроме того, Python3000 удалил sys.maxint
по теории, что все ints продвигаются к длинным, и лимит больше не применяется.
PEP 326, пример для верхних и нижних значений, вывел ссылку min и max в Python. Новое упорядоченное поведение задокументировано.
Поскольку PEP 326 был отклонен, какие полезные, пригодные для использования определения для значения min и max, которые работают с целыми числами и плаваниями и longs на Python 2X и Python 3000?
Edit
Несколько ответов идут по строкам "просто используйте maxv = float (" inf ")"... Причина, по которой я думаю, насколько это возможно, заключается в следующем:
>>> float(2**5000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float
и
>>> cmp(1.0**4999,10.0**5000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
Тем не менее:
>>> () > 2**5000
True
Для того чтобы cmp до значения float, float('inf')
, длинное значение нужно было бы преобразовать в float, и преобразование вызовет OverflowError
...
Заключение
Спасибо всем за ваши ответы и комментарии. Я выбрал TryPyPy ответ, потому что он казался наиболее встроенным в то, что я спрашивал: абсолютное наибольшее и абсолютное наименьшее значение, как описано в Wikipedia запись на бесконечность.
С этим вопросом я узнал, что значение long или int не преобразуется в float, чтобы завершить сравнение float('inf') > 2**5000
. Я этого не знал.