@cjw43 Here's a library's code snippet for squaring the elements of an input array:

```
def square_it(A):
    return A * A
```

That code is now broken, even though the library author has never even heard of a Matrix class.  The new, correct code, becomes:

```
def square_it(A):
    A = np.asarray(A)
    return A * A
```

That's not a problem as long as *all* consumers out there are aware of this possibility, but you are forcing a convention on programmers you don't control, and one which is auxiliary their intention.  Contrast that to the following library code:

```
def square_it(A):
    return A * A
```

We know what this does.  It squares the elements of the array.

```
def square_it(A):
    return A @ A
```

We know what this does, it performs a dot product between the two matrices.