Perhaps it is also worth going back to explore our original motivation for making this change.
One reason was that Sebastian didn't like people doing `x.shape = ...`. Users do that, presumably, to trigger an error if a copy needs to be made. However, we can catch that already: x = np.reshape(y, ...) if np.may_share_memory(x, y): ... We can fix Sebastian's issue by introducing a `copy` keyword to `reshape`, which currently has none: x = np.reshape(y, copy='never') For consistency, it would be nice to have `np.array` support copy=never, but if there is no urgency we can take the long route towards an API that uses strings (consistent with the rest of NumPy). The arguments against string names *right now* is that, if users write code with `copy='if-needed'` it will not work correctly with old NumPy code, since old versions will evaluate `if-needed` to True. The assessment was that this happens frequently, but we should consider how frequently, and how big of an issue it is. So, I guess ultimately I am wondering if the change to `np.array` is needed right now, or whether we can get away without it for a while. Stéfan On Tue, Jun 22, 2021, at 15:21, bas van beek wrote: > > Stefan, that sketch is more complicated than it needs to be - `np.copy` is > > a python function, so you can just attach the attributes directly! > > (although maybe there are implications for static typing) > > For the type annotations we can simply use something akin to Stéfans proposed > `NpCopy` class; > probably in combination with `Protocol`. > It's a bit more work compared to annotating a normal python function, but > it's quite easy nevertheless. > > Regards, Bas > > > *From:* NumPy-Discussion > <numpy-discussion-bounces+bas.vanbeek=hotmail....@python.org> on behalf of > Eric Wieser <wieser.eric+nu...@gmail.com> > *Sent:* 21 June 2021 18:56 > *To:* Discussion of Numerical Python <numpy-discussion@python.org> > *Subject:* Re: [Numpy-discussion] copy="never" discussion and no deprecation > cycle? > > > Stefan, that sketch is more complicated than it needs to be - `np.copy` is a > python function, so you can just attach the attributes directly! (although > maybe there are implications for static typing) > ``` > class CopyFlag(enum.Enum): > IF_NEEDED = 0 > ALWAYS = 1 > NEVER = 2 > > np.copy.IF_NEEDED = CopyFlag.IF_NEEDED > np.copy.ALWAYS = CopyFlag.ALWAYS > np.copy.NEVER = CopyFlag.NEVER > ``` > It would also work nicely for the `True/False/other` version that was > proposed in the much older PR as `np.never_copy`: > ``` > class _CopyNever: > def __bool__(self): raise ValueError > > np.copy.NEVER = _CopyNever() > ``` > > All of these versions (and using the enum directly) seem fine to me. > If we go down the enum route route, we probably want to add "new-style" > versions of `np.CLIP` and friends that are true enums / live within a more > obvious namespace. > > Eric > > On Mon, 21 Jun 2021 at 17:24, Stefan van der Walt <stef...@berkeley.edu> > wrote: >> On Sun, Jun 20, 2021, at 20:46, Gagandeep Singh wrote: >> > I have recently joined the mailing list and have gone through the previous >> > discussions on this thread. I would like to share my analysis (advantages >> > and disadvantages) of three possible alternatives (Enum, String, boolean) >> > to support the proposed feature. >> >> Thanks for this thorough analysis, Gagandeep! >> >> I'll throw one more heretical idea out there: >> >> `np.copy.IF_NEEDED`, `np.copy.ALWAYS`, `np.copy.NEVER`. >> >> This has the advantages of the enum, doesn't pollute the global namespace, >> and has an intuitive name. >> >> `np.array(x, copy=np.copy.ALWAYS)` >> >> It would be slightly more awkward to type, but is doable. A rough Python >> version sketch would be: >> >> class CopyFlag(enum.Enum): >> IF_NEEDED = 0 >> ALWAYS = 1 >> NEVER = 2 >> >> class NpCopy: >> IF_NEEDED : CopyFlag = CopyFlag.IF_NEEDED >> ALWAYS : CopyFlag = CopyFlag.ALWAYS >> NEVER : CopyFlag = CopyFlag.NEVER >> >> def __call__(self, x): >> return ...whatever copy returns... >> >> np.copy = NpCopy() >> >> >> Stéfan >> _______________________________________________ >> 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 > _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion