Это стандартная привязка модели данных в пользовательский __eq__
.
Упрощенный пример, приведенный ниже, должен прояснить для вас "колдовство".
>>> class MyObj:
... def __eq__(self, other):
... print(self, "is being compared with", other)
... return "potato"
...
>>> obj = MyObj()
>>> 0.1 + 0.2 == obj
<__main__.MyObj object at 0xcafef00d> is being compared with 0.30000000000000004
'potato'
Обратите внимание, что float.__eq__
получит первую попытку обработать это сравнение.Поведение, показанное выше, а также для approx(0.3)
, решающим образом зависит от того факта, что float
явно "отказался" от сравнения с MyObj
экземплярами.Он делает это, возвращая специальное значение NotImplemented
:
>>> (0.1+0.2).__eq__(obj)
NotImplemented
Для фактической реализации pytest, посмотрите в python_api.py::ApproxScalar
.