[Python-checkins] bpo-45167: Fix deepcopying of GenericAlias (GH-28324) (GH-28367)
ambv
webhook-mailer at python.org
Wed Sep 15 15:35:21 EDT 2021
https://github.com/python/cpython/commit/de4c9c0bdc9b62e68dacd0c4bac20d7f4c527511
commit: de4c9c0bdc9b62e68dacd0c4bac20d7f4c527511
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: ambv <lukasz at langa.pl>
date: 2021-09-15T21:35:16+02:00
summary:
bpo-45167: Fix deepcopying of GenericAlias (GH-28324) (GH-28367)
(cherry picked from commit 5dce51a8875d9639786741e962b3cb208596b096)
Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>
files:
A Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst
M Lib/test/test_genericalias.py
M Objects/genericaliasobject.c
diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py
index 2e70e751d4eee..0daaff099a868 100644
--- a/Lib/test/test_genericalias.py
+++ b/Lib/test/test_genericalias.py
@@ -2,6 +2,7 @@
import unittest
import pickle
+import copy
from collections import (
defaultdict, deque, OrderedDict, Counter, UserDict, UserList
)
@@ -270,11 +271,30 @@ class MyType(type):
def test_pickle(self):
alias = GenericAlias(list, T)
- s = pickle.dumps(alias)
- loaded = pickle.loads(s)
- self.assertEqual(alias.__origin__, loaded.__origin__)
- self.assertEqual(alias.__args__, loaded.__args__)
- self.assertEqual(alias.__parameters__, loaded.__parameters__)
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ s = pickle.dumps(alias, proto)
+ loaded = pickle.loads(s)
+ self.assertEqual(loaded.__origin__, alias.__origin__)
+ self.assertEqual(loaded.__args__, alias.__args__)
+ self.assertEqual(loaded.__parameters__, alias.__parameters__)
+
+ def test_copy(self):
+ class X(list):
+ def __copy__(self):
+ return self
+ def __deepcopy__(self, memo):
+ return self
+
+ for origin in list, deque, X:
+ alias = GenericAlias(origin, T)
+ copied = copy.copy(alias)
+ self.assertEqual(copied.__origin__, alias.__origin__)
+ self.assertEqual(copied.__args__, alias.__args__)
+ self.assertEqual(copied.__parameters__, alias.__parameters__)
+ copied = copy.deepcopy(alias)
+ self.assertEqual(copied.__origin__, alias.__origin__)
+ self.assertEqual(copied.__args__, alias.__args__)
+ self.assertEqual(copied.__parameters__, alias.__parameters__)
def test_union(self):
a = typing.Union[list[int], list[str]]
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst
new file mode 100644
index 0000000000000..47755ae59be2b
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-14-09-23-59.bpo-45167.CPSSoV.rst
@@ -0,0 +1 @@
+Fix deepcopying of :class:`types.GenericAlias` objects.
diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c
index dda53cb533864..e36e0c03476b5 100644
--- a/Objects/genericaliasobject.c
+++ b/Objects/genericaliasobject.c
@@ -418,6 +418,8 @@ static const char* const attr_exceptions[] = {
"__mro_entries__",
"__reduce_ex__", // needed so we don't look up object.__reduce_ex__
"__reduce__",
+ "__copy__",
+ "__deepcopy__",
NULL,
};
More information about the Python-checkins
mailing list