Подтвердить что ты не робот

Как объект int() использует оператор "==" без метода __eq __() в python2?

Недавно я прочитал "Свободный питон" и понял, как оператор == работает с объектами python, используя __eq__(). Но как это работает с экземплярами int в python2?

>>> a = 1
>>> b = 1
>>> a == b
True
>>> a.__eq__(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__eq__'

в python3 все a.__eq__(b) возвращает True

4b9b3361

Ответ 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

Ответ 2

В Python 2 объект int использует метод __cmp__() вместо богатых методов, таких как __eq__(), __lt__(), __gt__() и других.