[Numpy-discussion] copy="never" discussion and no deprecation cycle?

bas van beek bas.vanbeek at hotmail.com
Tue Jun 22 18:21:17 EDT 2021


> 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.com at python.org> on behalf of Eric Wieser <wieser.eric+numpy at gmail.com>
Sent: 21 June 2021 18:56
To: Discussion of Numerical Python <numpy-discussion at 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 <stefanv at berkeley.edu<mailto:stefanv at 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 at python.org<mailto:NumPy-Discussion at python.org>
https://mail.python.org/mailman/listinfo/numpy-discussion
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.python.org/pipermail/numpy-discussion/attachments/20210622/b87a93bd/attachment.html>


More information about the NumPy-Discussion mailing list