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

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

>>> not foo > None
True

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

Ответ 1

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).

Ответ 2

Из источника 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. Добавлен номер версии.