On Jun 6, 2008, at 3:24 PM, Guido van Rossum wrote:
On Fri, Jun 6, 2008 at 1:10 PM, Jared Flatow
<[EMAIL PROTECTED]> wrote:
PEP 207 (http://www.python.org/dev/peps/pep-0207/) states in the
fourth
clause of the proposed resolutions to concerns:
"The reflexivity rules *are* assumed by Python. Thus, the
interpreter may
swap y>x with x<y, y>=x with x<=y, and may swap the arguments of
x==y and
x!=y."
However, if this is the case, why does Python allow the definition
of both
pairs of __le__, __ge__ and __lt__, __gt__ for a single class,
since users
have no guarantee over which will be called? Currently, if I do not
want x
= y to mean the same thing as y <= x (and believe it or not I
believe I
have a good use case for doing this),
I find it hard to believe that your users will be happy with that
though. :-)
In this case, I am my users and I would be very happy with it (but I
won't try to justify it :).
there is no reliable way of doing this.
Does it help if I tell you that for "x <binop> y" we always try
x.__binop__(y) before trying y.__reverse_binop__(x), *except* in the
case where y is an instance of a subclass of the class of x?
Yes, actually that explains quite a bit, and now I see that is the
case I am dealing with. y is an instance of a subclass of x, but the
class of x is the one that defines both the binops. I suppose it is
too much to ask to only call the __reverse_binop__ if the subclass
overrides it.
However, if the decision is to not allow users to do this at all
using
operators (and force them to create specially named methods), what
is the
point of allowing the definition of both?
The same reason we allow (require) you to define __add__ and __radd_.
It is quite possible that for any particular binary operation "x
<binop> y", the class of x doesn't know how to implement it, and then
the class of y is tried with the reversed operation.
It seems very confusing to me (and
indeed I was at first very confused what was going on), to tempt
users to be
able to define both but give no promise that if they do, the
appropriate one
will be called. Does anyone have a good explanation for this?
I have explained it as well as I can.
Thanks very much, at least that is enough information to work around
reliably.
jared
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com