Существует ли встроенный тип данных Python, помимо None, для которого:
>>> not foo > None
True
где foo - значение этого типа? Как насчет Python 3?
Существует ли встроенный тип данных Python, помимо None, для которого:
>>> not foo > None
True
где foo - значение этого типа? Как насчет Python 3?
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).
None<0 возвращает True), и, по-видимому, в Python 3 это решается путем полного запрета таких сравнений - действительно огромное «улучшение» ...! ;-)
- person Rolf Bartstra; 06.12.2012
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: добавлен номер версии.