From 8871c7285fc097fd1bf713aa184cba7e2804f625 Mon Sep 17 00:00:00 2001 From: Bas van Beek Date: Wed, 10 Nov 2021 15:36:00 +0100 Subject: [PATCH] MAINT: Do not forward `__(deep)copy__` calls of `_GenericAlias` to the wrapped type Adapt to the python 3.9.8 changes made in bpo-45167. --- numpy/typing/_generic_alias.py | 2 ++ numpy/typing/tests/test_generic_alias.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/numpy/typing/_generic_alias.py b/numpy/typing/_generic_alias.py index 932f12dd05d..1eb2c8c05f0 100644 --- a/numpy/typing/_generic_alias.py +++ b/numpy/typing/_generic_alias.py @@ -185,6 +185,8 @@ def __eq__(self, value: object) -> bool: "__mro_entries__", "__reduce__", "__reduce_ex__", + "__copy__", + "__deepcopy__", }) def __getattribute__(self, name: str) -> Any: diff --git a/numpy/typing/tests/test_generic_alias.py b/numpy/typing/tests/test_generic_alias.py index 3021d985934..39343420bdc 100644 --- a/numpy/typing/tests/test_generic_alias.py +++ b/numpy/typing/tests/test_generic_alias.py @@ -1,6 +1,7 @@ from __future__ import annotations import sys +import copy import types import pickle import weakref @@ -80,6 +81,21 @@ def test_pass(self, name: str, func: FuncType) -> None: value_ref = func(NDArray_ref) assert value == value_ref + @pytest.mark.parametrize("name,func", [ + ("__copy__", lambda n: n == copy.copy(n)), + ("__deepcopy__", lambda n: n == copy.deepcopy(n)), + ]) + def test_copy(self, name: str, func: FuncType) -> None: + value = func(NDArray) + + # xref bpo-45167 + GE_398 = ( + sys.version_info[:2] == (3, 9) and sys.version_info >= (3, 9, 8) + ) + if GE_398 or sys.version_info >= (3, 10, 1): + value_ref = func(NDArray_ref) + assert value == value_ref + def test_weakref(self) -> None: """Test ``__weakref__``.""" value = weakref.ref(NDArray)()