On Mon, Mar 17, 2014 at 12:50 PM, Alexander Belopolsky <ndar...@mac.com>wrote:

>
> On Mon, Mar 17, 2014 at 12:13 PM, Nathaniel Smith <n...@pobox.com> wrote:
>
>> In practice all
>> well-behaved classes have to make sure that they implement __special__
>> methods in such a way that all the different variations work, no
>> matter which class ends up actually handling the operation.
>>
>
> "Well-behaved classes" are hard to come by in practice.  The @ operator
> may fix the situation with np.matrix, so take a look at MaskedArray with
> its 40-line __array_wrap__ and no end of bugs.
>
> Requiring superclass __method__ to handle creation of subclass results
> correctly is turning Liskov principle on its head.  With enough clever
> tricks and tight control over the full class hierarchy you can make it work
> in some cases, but it is not a good design.
>
> I am afraid that making @ special among other binary operators that
> implement mathematically associative operations will create a lot of
> confusion.  (The pow operator is special because the corresponding
> mathematical operation is non-associative.)
>
> Imagine teaching someone that a % b % c = (a % b) % c, but a @ b @ c = a @
> (b @ c).  What are the chances that they will correctly figure out what a
> // b // c means after this?
>

One case where we need to keep track of left or right is type promotion

>>> a.shape
(100,)
>>> 1. * a.dot(a)
-98.0
>>> (1.*a).dot(a)
328350.0
>>> a.dtype
dtype('int8')

>>> 1. * a @ a
???

similar to
>>> 1. * 2 / 3
0.6666666666666666
>>> 1. * (2 / 3)   # I'm not in the `future`
0.0

Josef



>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
> >>> 1. * a.dot(a)
-98.0
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to