It just isn’t well defined to try to duck-type these things. There are many different numeric and non-numeric types in Python that implement operators like < and == in many different ways returning varying types and having varying semantics.
If you want well-defined predictable behaviour then you need a well-defined and predictable way of getting the inputs to known numeric types and __float__ is the math module’s way of doing that.