Hi Hameer, I think the override on `dtype` would work - after all, the override is checked before anything is done, so one can just pass in `self` if one wishes (or some helper class that contains both `self` and any desired further information.
But, as you note, it would not cover everything, and your `array_reference` idea definitely makes things more uniform. Indeed, it would allow one to implement things like `np.zeros_like` using `np.zero`, which seems quite nice. Still, I'm not sure whether this should be included in the present NEP or is best done separately after, with a few concrete examples of where it would be useful. All the best, Marten On Sat, Jun 30, 2018 at 10:40 AM, Hameer Abbasi <einstein.edi...@gmail.com> wrote: > Hi Marten, > > Sorry, I had clearly misunderstood. It would indeed be nice for overrides > to work on functions like `zeros` or `arange` as well, but it seems strange > to change the signature just for that. As a possible alternative, should we > perhaps generally check for overrides on `dtype`? > > > While this very clearly makes sense for something like astropy, it has a > few drawbacks: > > - Other duck arrays such as Dask need more information than just the > dtype. For example, Dask needs chunk sizes, XArray needs axis labels, and > pydata/sparse needs to know the type of the reference array in order > to make one of the same type. The information in a reference array is a > strict superset of information in the dtype. > - There’s a need for a separate protocol, which might be a lot harder > to work with for both NumPy and library authors. > - Some things, like numpy.random.RandomState, don’t accept a dtype > argument. > > As for your concern about changing the signature, it’s easy enough with a > decorator. We’ll need a separate decorator for array generation functions. > Something like: > > def array_generation_function(func): > @functools.wraps(func) > def wrapped(*args, **kwargs, array_reference=np._NoValue): > if array_reference is not np._NoValue: > success, result = try_array_function_override(wrapped, > [array_reference], args, kwargs) > > if success: > return result > > return func(*args, **kwargs) > > return wrapped > > Hameer Abbasi > > > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org > https://mail.python.org/mailman/listinfo/numpy-discussion > >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion