[Numpy-discussion] NEP: Dispatch Mechanism for NumPy’s high level API (original) (raw)
Marten van Kerkwijk m.h.vankerkwijk at gmail.com
Mon Jun 4 10:34:49 EDT 2018
- Previous message (by thread): [Numpy-discussion] NEP: Dispatch Mechanism for NumPy’s high level API
- Next message (by thread): [Numpy-discussion] NEP: Dispatch Mechanism for NumPy’s high level API
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi Stephan,
Another potential consideration in favor of NotImplementedButCoercible is
for subclassing: we could use it to write the default implementations of ndarray.arrayufunc and ndarray.arrayfunction, e.g.,
class ndarray: def arrayufunc(self, *args, **kwargs): return NotIImplementedButCoercible def arrayfunction(self, *args, **kwargs): return NotIImplementedButCoercible I think (not 100% sure yet) this would result in exactly equivalent behavior to what ndarray.arrayufunc currently does: http://www.numpy.org/neps/nep-0013-ufunc-overrides.html# subclass-hierarchies
As written would not work for ndarray subclasses, because the subclass will generically change itself before calling super. At least for Quantity, say if I add two quantities, the quantities will both be converted to arrays (with one scaled so that the units match) and then the super call is done with those modified arrays. This expects that the super call will actually return a result (which it now can because all inputs are arrays).
But I think it would work to return NotImplementedButCoercible
in the
case that perhaps you had in mind in the first place, in which any of the
other arguments had a __array_ufunc__
implementation and ndarray
thus
does not know what to do. For those cases, ndarray
currently returns a
straight NotImplemented
.
Though I am still a bit worried: this gets back to
Quantity.__array_ufunc__
, but what does it do with it? It cannot just
pass it on, since then it is effectively telling, incorrectly, that the
quantity is coercible, which it is not. I guess at this point it would
have to change it to NotImplemented
. Looking at my current
implementation, I see that if we made this change to
ndarray.__array_ufunc__
, the implementation would mostly raise an
exception as it tried to view NotImplementedButCoercible
as a quantity,
except for comparisons, where the output is not viewed at all (being
boolean and thus unit-less) and passed straight down. That said, we've said
the array_ufunc implementation is experimental, so I think such small
annoyances are OK.
Overall, it is an intriguing idea, and I think it should be mentioned at least in the NEP. It would be good, though, to have a few more examples of how it would work in practice.
All the best,
Marten -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20180604/7d95d292/attachment-0001.html>
- Previous message (by thread): [Numpy-discussion] NEP: Dispatch Mechanism for NumPy’s high level API
- Next message (by thread): [Numpy-discussion] NEP: Dispatch Mechanism for NumPy’s high level API
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]