Skip to content

Commit 3bc8019

Browse files
positaFidget-Spinnerserhiy-storchaka
authored
[3.10] bpo-46581: Propagate private vars via _GenericAlias.copy_with (GH-31061) (GH-31821)
(Cherry-picked from 32bf359.) GH-26091 added the _typevar_types and _paramspec_tvars instance variables to _GenericAlias. However, they were not propagated consistently. This commit addresses the most prominent deficiency identified in bpo-46581 (namely their absence from _GenericAlias.copy_with), but there could be others. Co-authored-by: Ken Jin <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]> Co-authored-by: Ken Jin <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 4199b7f commit 3bc8019

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

Lib/test/test_typing.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4990,6 +4990,27 @@ def test_paramspec_in_nested_generics(self):
49904990
self.assertEqual(G2[[int, str], float], list[C])
49914991
self.assertEqual(G3[[int, str], float], list[C] | int)
49924992

4993+
def test_paramspec_gets_copied(self):
4994+
# bpo-46581
4995+
P = ParamSpec('P')
4996+
P2 = ParamSpec('P2')
4997+
C1 = Callable[P, int]
4998+
self.assertEqual(C1.__parameters__, (P,))
4999+
self.assertEqual(C1[P2].__parameters__, (P2,))
5000+
self.assertEqual(C1[str].__parameters__, ())
5001+
self.assertEqual(C1[str, T].__parameters__, (T,))
5002+
self.assertEqual(C1[Concatenate[str, P2]].__parameters__, (P2,))
5003+
self.assertEqual(C1[Concatenate[T, P2]].__parameters__, (T, P2))
5004+
self.assertEqual(C1[...].__parameters__, ())
5005+
5006+
C2 = Callable[Concatenate[str, P], int]
5007+
self.assertEqual(C2.__parameters__, (P,))
5008+
self.assertEqual(C2[P2].__parameters__, (P2,))
5009+
self.assertEqual(C2[str].__parameters__, ())
5010+
self.assertEqual(C2[str, T].__parameters__, (T,))
5011+
self.assertEqual(C2[Concatenate[str, P2]].__parameters__, (P2,))
5012+
self.assertEqual(C2[Concatenate[T, P2]].__parameters__, (T, P2))
5013+
49935014

49945015
class ConcatenateTests(BaseTestCase):
49955016
def test_basics(self):

Lib/typing.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,9 @@ def Concatenate(self, parameters):
600600
"ParamSpec variable.")
601601
msg = "Concatenate[arg, ...]: each arg must be a type."
602602
parameters = (*(_type_check(p, msg) for p in parameters[:-1]), parameters[-1])
603-
return _ConcatenateGenericAlias(self, parameters)
603+
return _ConcatenateGenericAlias(self, parameters,
604+
_typevar_types=(TypeVar, ParamSpec),
605+
_paramspec_tvars=True)
604606

605607

606608
@_SpecialForm
@@ -1079,7 +1081,9 @@ def __getitem__(self, params):
10791081
return self.copy_with(tuple(new_args))
10801082

10811083
def copy_with(self, params):
1082-
return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
1084+
return self.__class__(self.__origin__, params, name=self._name, inst=self._inst,
1085+
_typevar_types=self._typevar_types,
1086+
_paramspec_tvars=self._paramspec_tvars)
10831087

10841088
def __repr__(self):
10851089
if self._name:
@@ -1281,11 +1285,6 @@ def __hash__(self):
12811285

12821286

12831287
class _ConcatenateGenericAlias(_GenericAlias, _root=True):
1284-
def __init__(self, *args, **kwargs):
1285-
super().__init__(*args, **kwargs,
1286-
_typevar_types=(TypeVar, ParamSpec),
1287-
_paramspec_tvars=True)
1288-
12891288
def copy_with(self, params):
12901289
if isinstance(params[-1], (list, tuple)):
12911290
return (*params[:-1], *params[-1])

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Paul Boddie
190190
Matthew Boedicker
191191
Robin Boerdijk
192192
Andra Bogildea
193+
Matt Bogosian
193194
Nikolay Bogoychev
194195
David Bolen
195196
Wouter Bolsterlee
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Brings :class:`ParamSpec` propagation for :class:`GenericAlias` in line with
2+
:class:`Concatenate` (and others).

0 commit comments

Comments
 (0)