Все ли больше, чем None?

Существует ли встроенный тип данных Python, помимо None, для которого:

>>> not foo > None
True

где foo - значение этого типа? Как насчет Python 3?


person Attila O.    schedule 06.02.2010    source источник


Ответы (2)


None всегда меньше любого типа данных в Python 2 (см. object.c).

В Python 3 это было изменено; теперь сравнение вещей без разумного естественного порядка приводит к TypeError. Из новостей 3.0:

Python 3.0 упростил правила упорядочивания сравнений:

Операторы сравнения порядка (<, <=, >=, >) вызывают исключение TypeError, когда операнды не имеют значимого естественного порядка. Таким образом, такие выражения, как: 1 < '', 0 > None или len <= len больше недействительны, и, например. None < None повышает TypeError вместо возврата False. Следствием этого является то, что сортировка разнородного списка больше не имеет смысла — все элементы должны быть сопоставимы друг с другом. Обратите внимание, что это не относится к операторам == и !=: объекты разных несравнимых типов всегда сравниваются неравными друг другу.

Некоторых это расстраивало, так как часто было удобно делать такие вещи, как сортировка списка, в котором есть несколько значений None, и чтобы значения None отображались сгруппированными вместе в начале или конце. Был поток в списке рассылки об этом некоторое время назад, но конечная точка заключается в том, что Python 3 пытается избежать принятия произвольных решений о порядке (что часто происходило в Python 2).

person John Feminella    schedule 06.02.2010
comment
Спасибо за разъяснение состояния Python 3. Я помню, как читал страницу «Что нового», но не помню эту. Очень интересно, но логично... - person Attila O.; 06.02.2010
comment
Конечно, нет ничего произвольного в упорядочении None, если оно четко определено. Именно из-за такой неуместной несовместимости внедрение Python 3 занимает так много времени. - person Glenn Maynard; 07.02.2010
comment
Четко определенное (четкое, явное определение поведения) отличается от произвольного (выбор, сделанный на основе усмотрения). Например, с таким же успехом можно было бы сказать, что ничто не сравнивается лучше, чем все. Это одинаково четко определено, но все же довольно произвольно. - person John Feminella; 07.02.2010
comment
Действительно, было чрезвычайно удобно (например, проверки правильности ввода) позволять сравнивать несопоставимые типы, и мне казалось логичным, чтобы такие сравнения всегда возвращали False - например, при сравнении числовых значений с NaN. К сожалению, это было не так (например, None<0 возвращает True), и, по-видимому, в Python 3 это решается путем полного запрета таких сравнений - действительно огромное «улучшение» ...! ;-) - person Rolf Bartstra; 06.12.2012
comment
То, что None сравнивается меньше, чем все, кажется гораздо менее произвольным, чем то, что оно сравнивает больше, чем все. Пустые строки предшествуют любой другой строке, «ноль» предшествует любому положительному целому числу, поэтому интуитивно понятно, что тип None предшествует любому другому типу. - person HorseloverFat; 09.02.2013
comment
@GlennMaynard: Да, порядок None в списке чисел является произвольным, потому что это не число. В настоящее время if parameter < 0 не работает, если parameter=None по умолчанию, что глупо. Вы всегда можете сделать key=lambda x: float('-inf') if x is None else x или key=lambda x: float('inf') if x is None else x или key=lambda x: 0 if x is None else x, в зависимости от того, какой произвольный порядок вы предпочитаете. - person endolith; 01.04.2013

Из источника Python 2.7.5 ( object.c):

static int
default_3way_compare(PyObject *v, PyObject *w)
{
    ...
    /* None is smaller than anything */
    if (v == Py_None)
            return -1;
    if (w == Py_None)
            return 1;
    ...
}

EDIT: добавлен номер версии.

person Torsten Marek    schedule 06.02.2010
comment
Я полагаю, это для Python 2.x? - person MatrixFrog; 06.02.2010