Сравнение None со встроенными типами с использованием арифметических операторов? - PullRequest
23 голосов
/ 22 января 2012
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> None > 0
False
>>> None == 0
False
>>> None < 0
True
  • Сравнивает ли None арифметические операторы, хорошо определенные для встроенных типов (в данном случае целые числа)?
  • Разница между первыми двумя и третьей частью сравнения спецификации языка (спецификация Python - вы, должно быть, шутите :)) или это детали реализации CPython?

Ответы [ 2 ]

23 голосов
/ 22 января 2012

Единственное значимое сравнение, которое вы действительно можете использовать с None, это if obj is None: (или if obj is not None:).

Сравнение между различными типами было удалено из Python 3 по веским причинам - они были распространенным источником ошибок и приводили к путанице. Например

>>> "3" < 4
False

В Python 3 вы получаете TypeError при сравнении значений разных типов, таких как str против int или чего-либо против None.

>>> None < 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()

(Я имею в виду «сравнение» в смысле попытки определить, какое из двух значений больше / меньше. Сравнение на равенство в порядке - оно всегда вернет False, если два объекта имеют разные типы.)

Я не нашел ссылки в документации на это, но в Learning Python, 4-е издание , Марк Лутц пишет на странице 204:

[...] Сравнение объектов разного типа (например, строка и список) работа - язык определяет фиксированный порядок среди различных типы, которые являются детерминированными, если не эстетически приятными. То есть, порядок основан на именах участвующих типов: все целые меньше, чем все строки, например, потому что "int" меньше "str".

6 голосов
/ 22 января 2012

Некоторые интересные цитаты из http://bytes.com/topic/python/answers/801701-why-none-0-a

В раннем Python было принято решение, что сравнение любое два объекта были законными и возвращали последовательный результат. Итак, объекты разных типов будут сравнивать в соответствии с порядком их типы (зависящие от реализации, неопределенные, но согласованные упорядочение), и объекты одного типа будут сравниваться в соответствии с правила, которые имеют смысл для этого типа.

Другие реализации имеют право сравнивать целое и None иначе, но при конкретной реализации, результат не будет изменить.

Python 3 вызовет исключение при таких сравнениях.

и

Проблема типичная; Python изначально не имел Тип Boolean и модификация привели к странной семантике. С имеет та же проблема.

...