Сравнение None со встроенными типами с использованием арифметических операторов?

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 ответа

Решение

Единственное значимое сравнение, которое вы действительно можете использовать 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 если два объекта разных типов.)

В документах я не нашел ссылки на это, но в " Изучении Python", 4-е издание, Марк Лутц пишет на странице 204:

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

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

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

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

Python 3 выдаст исключение для таких сравнений.

а также

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

Другие вопросы по тегам