On Tue, 25 May 2021 at 13:31, Sergey B Kirpichev <skirpic...@gmail.com> wrote:
>
> > >>> solve(x**2 == 1/2)
> > as you might notice, this is fully legal Python syntax. Unfortunately
> > the semantics is such that sympy has no way to determine what is
> > actually going on, this is why they invented all those helper
> > functions shown above.
>
> This is a SymPy special "solution".  Nothing in Python prevents from
> returning a non-boolean from __eq__():
> https://docs.python.org/3/reference/datamodel.html#object.__eq__
>
> For example, instead you could use singletons.  In fact, every object in
> symbolic math is a singleton.  x**2 is such, (x + 1)**2 - 2*x - 1 - is
> another, different one.  To test structural equality in this approach -
> you can use "is", instead of "==".

Although nothing in Python prevents defining __eq__() how you want and
having it return other values can still be problematic to do so
because of the way that __eq__() is tied to __hash__() and used in
dicts and sets. Python the language made the decision that the ==
operator is also used for equality in dicts and sets. If x**2 == 1/2
were to return a symbolic equation object then it would imply that
symbolic objects could not be used in Python's important container
types.

The overloaded use of == in Python also leads to a tension between
wanting e.g. 1 == 1.0 when == is used explicitly but perhaps not
wanting 1 and 1.0 to be interchangeable in a dict/set:

>>> {1.0, 1}
{1.0}
>>> {1, 1.0}
{1}

On that basis I would say that unless you are sure you have no need to
use objects as dict keys or in sets then you should define __eq__() so
that a==b returns a bool. Also a==b should only return True in the
cases where a and b are interchangeable and you genuinely don't care
which of the two objects you would get.

--
Oscar
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/LIPBCQ3BZYHBBDDEDELTLC55YWS3QASG/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to