Сравнение 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 не имел булева типа, и его модификация привела к странной семантике. С имеет ту же проблему.