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

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

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?
4b9b3361

Ответ 1

Единственное содержательное сравнение, которое вы действительно можете использовать с 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, 4-е издание Марк Лутц пишет на стр. 204:

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

Ответ 2

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

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

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

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

и

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