On Thu, Sep 29, 2022 at 10:10 AM Sebastian Berg <sebastian@sipsolutions.net> wrote:
On Wed, 2022-09-28 at 16:44 -0700, Stefan van der Walt wrote:
> Hi Sebastian,
> On Wed, Sep 28, 2022, at 12:11, Sebastian Berg wrote:
> >     np.array([1, 2], dtype="uint8") + (-1)
> >
> > which currently returns an "int16" array must raise an error.  This
> > is
> > because we want to return a uint8 array but the -1 cannot be
> > represented well by -1.
> Did you mean: the -1 is not representable in uint8?

Sorry yes.  With NEP 50, we do not look at the value (initially) so
determine that the operation must be handled as:

    uint8 + uint8 -> uint8

We then try to convert the -1 to uint8.  That conversion would raise an
error, because previously the result was an int16.
(This is to prevent silent unexpected result changes and seemed like
the more reasonable behavior.)

On the other hand, assignments like:

    uint8_arr[0] = -1
    np.array([-1], dtype=np.uint8)

do happily convert the -1 to `uint8`, currently.  If we keep allowing
these, we have two slightly different conversions:  one that fails and
one that does not.

This is fine, but maybe we actually want it to always fail in the

It seems better to always raise an exception indeed. So if it simplifies your PR to do that now, I'd say go for it.