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

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?

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

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

 >>> "3" < 4 False 

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

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

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

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

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

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

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

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

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

а также

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