Ответ 1
Python предпочитает использовать расширенные функции сравнения (__eq__
, __lt__
, __ne__
и т.д.), Но если они не существуют, он использует единственную функцию сравнения (__cmp__
, удалено в Python 3):
Это так называемые методы "расширенного сравнения", которые вызываются для операторов сравнения вместо
__cmp__()
ниже.
Целочисленный тип Python 2 не реализует богатую функцию сравнения:
PyTypeObject PyInt_Type = {
...
(cmpfunc)int_compare, /* tp_compare */
...
0, /* tp_richcompare */
В Python 3 целочисленный тип (теперь длинный) реализует только богатую функцию сравнения, поскольку Python 3 отказался от поддержки __cmp__
:
PyTypeObject PyLong_Type = {
...
long_richcompare, /* tp_richcompare */
Вот почему (123).__eq__
не существует. Вместо этого Python 2 возвращается к (123).__cmp__
при проверке равенства двух целых чисел:
>>> (1).__eq__(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__eq__'
>>> (1).__cmp__(2)
-1