Hi everyone,

> One bit of expressivity we would miss is “copy if necessary, but otherwise 
> don’t bother”, but there are workarounds to this.

After a side discussion with Stéfan van der Walt, we came up with 
`allow_copy=True`, which would express to the downstream library that we don’t 
mind waiting, but that zero-copy would also be ok.

> This sounds like the sort of thing that is use case driven. If enough 
> projects want to use it, then I have no objections to adding the keyword. 
> OTOH, we need to be careful about adding too many interoperability tricks as 
> they complicate the code and makes it hard for folks to determine the best 
> solution. Interoperability is a hot topic and we need to be careful not put 
> too leave behind too many experiments in the NumPy code.  Do you have any 
> other ideas of how to achieve the same effect?

Personally, I don’t have any other ideas, but would be happy to hear some!

My view regarding API/experiment creep is that `__array__` is the oldest and 
most basic of all the interop tricks and that this can be safely maintained for 
future generations. Currently it only takes `dtype=` as a keyword argument, so 
it is a very lean API. I think this particular use case is very natural and 
I’ve encountered the reluctance to implicitly copy twice, so I expect it is 
reasonably common.

Regarding difficulty in determining the best solution, I would be happy to 
contribute to the dispatch basics guide together with the new kwarg. I agree 
that the protocols are getting quite numerous and I couldn’t find a single 
place that gathers all the best practices together. But, to reiterate my point: 
`__array__` is the simplest of these and I think this keyword is pretty safe to 
add.

For ease of discussion, here are the API options discussed so far, as well as a 
few extra that I don’t like but might trigger other ideas:

np.asarray(my_duck_array, allow_copy=True)  # default is False, or None -> 
leave it to the duck array to decide
np.asarray(my_duck_array, copy=True)  # always copies, but, if supported by the 
duck array, defers to it for the copy
np.asarray(my_duck_array, copy=‘allow’)  # could take values ‘allow’, ‘force’, 
’no’, True(=‘force’), False(=’no’)
np.asarray(my_duck_array, force_copy=False, allow_copy=True)  # separate 
concepts, but unclear what force_copy=True, allow_copy=False means!
np.asarray(my_duck_array, force=True)

Juan.
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion

Reply via email to