> 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<mailto: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<mailto: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

Reply via email to