почему в Python 2.x поддерживается оператор › между function и int?

В Python 2.x следующий код, как и ожидалось, выдает ошибку:

>>> def a(x): return x+3 
...
>>> a+4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'function' and 'int'

Однако допускается следующее:

>>> a < 4
False

Почему оператор + не определен для функции и int, а оператор ‹ определен?


person Brian Minton    schedule 16.05.2014    source источник
comment
Просто примечание: это даст вам TypeError: unorderable types: function() < int() на Py3k.   -  person vaultah    schedule 16.05.2014
comment
Связано: stackoverflow.com/questions /4084243/   -  person John Y    schedule 16.05.2014
comment
Также stackoverflow. ком/вопросы/18516827/   -  person devnull    schedule 16.05.2014
comment
связано: stackoverflow.com/questions/15451472/   -  person devnull    schedule 16.05.2014
comment
stackoverflow.com/questions/18387938/   -  person devnull    schedule 16.05.2014
comment
@devnull: Теперь я уже не знаю, что выбрать. Какой из них вы считаете каноническим?   -  person Martijn Pieters    schedule 16.05.2014


Ответы (1)


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

CPython (оригинальная имплементация Python) заказывает None перед числами, а затем числа перед всем остальным. Объекты, которые сами не реализуют упорядочение, сравниваются по имени их типа; поэтому function сортируется перед экземплярами класса Zippedeedoodah. Другие реализации могут свободно выбирать другие порядки.

Python делает это для поддержки сортировки разнородных списков. Цитата из документации по сравнению значений:

Операторы <, >, ==, >=, <= и != сравнивают значения двух объектов. Объекты не обязательно должны иметь один и тот же тип.

Сравнение порядка по умолчанию (<, >, <= и >=) дает постоянный, но произвольный порядок.

В Python 3 поддерживаются только объекты, явно поддерживающие упорядочение, все остальное вызывает исключение:

>>> def a(x): return x+3 
... 
>>> a < 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: function() < int()
person Martijn Pieters    schedule 16.05.2014
comment
+1. Я пропустил такие сообщения. Кратко, основательно и легко для понимания. - person vaultah; 16.05.2014
comment
Можете дать ссылку на документацию по этому поводу? - person Brian Minton; 16.05.2014
comment
@BrianMinton: см. раздел Сравнения справочного руководства. - person Martijn Pieters; 16.05.2014
comment
Первая строка неверна: тип complex не подлежит заказу. - person wim; 19.10.2020
comment
@wim они действительно явно выдают исключения при использовании в сравнениях. Наборы также проблематичны тем, что они не поддерживают полный порядок. Думаю, лучше сказать, что реализация по умолчанию для всех объектов доступна для заказа. - person Martijn Pieters; 20.10.2020