Skip to content

Commit 5dce51a

Browse files
bpo-45167: Fix deepcopying of GenericAlias (GH-28324)
1 parent 84a6061 commit 5dce51a

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

Lib/test/test_genericalias.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import unittest
44
import pickle
5+
import copy
56
from collections import (
67
defaultdict, deque, OrderedDict, Counter, UserDict, UserList
78
)
@@ -270,11 +271,30 @@ class MyType(type):
270271

271272
def test_pickle(self):
272273
alias = GenericAlias(list, T)
273-
s = pickle.dumps(alias)
274-
loaded = pickle.loads(s)
275-
self.assertEqual(alias.__origin__, loaded.__origin__)
276-
self.assertEqual(alias.__args__, loaded.__args__)
277-
self.assertEqual(alias.__parameters__, loaded.__parameters__)
274+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
275+
s = pickle.dumps(alias, proto)
276+
loaded = pickle.loads(s)
277+
self.assertEqual(loaded.__origin__, alias.__origin__)
278+
self.assertEqual(loaded.__args__, alias.__args__)
279+
self.assertEqual(loaded.__parameters__, alias.__parameters__)
280+
281+
def test_copy(self):
282+
class X(list):
283+
def __copy__(self):
284+
return self
285+
def __deepcopy__(self, memo):
286+
return self
287+
288+
for origin in list, deque, X:
289+
alias = GenericAlias(origin, T)
290+
copied = copy.copy(alias)
291+
self.assertEqual(copied.__origin__, alias.__origin__)
292+
self.assertEqual(copied.__args__, alias.__args__)
293+
self.assertEqual(copied.__parameters__, alias.__parameters__)
294+
copied = copy.deepcopy(alias)
295+
self.assertEqual(copied.__origin__, alias.__origin__)
296+
self.assertEqual(copied.__args__, alias.__args__)
297+
self.assertEqual(copied.__parameters__, alias.__parameters__)
278298

279299
def test_union(self):
280300
a = typing.Union[list[int], list[str]]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix deepcopying of :class:`types.GenericAlias` objects.

Objects/genericaliasobject.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,8 @@ static const char* const attr_exceptions[] = {
418418
"__mro_entries__",
419419
"__reduce_ex__", // needed so we don't look up object.__reduce_ex__
420420
"__reduce__",
421+
"__copy__",
422+
"__deepcopy__",
421423
NULL,
422424
};
423425

0 commit comments

Comments
 (0)