summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_typing.py21
-rw-r--r--Lib/typing.py13
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2022-02-01-11-32-47.bpo-46581.t7Zw65.rst2
4 files changed, 30 insertions, 7 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 5c1e907..fc596e4 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -5793,6 +5793,27 @@ class ParamSpecTests(BaseTestCase):
self.assertEqual(G2[[int, str], float], list[C])
self.assertEqual(G3[[int, str], float], list[C] | int)
+ def test_paramspec_gets_copied(self):
+ # bpo-46581
+ P = ParamSpec('P')
+ P2 = ParamSpec('P2')
+ C1 = Callable[P, int]
+ self.assertEqual(C1.__parameters__, (P,))
+ self.assertEqual(C1[P2].__parameters__, (P2,))
+ self.assertEqual(C1[str].__parameters__, ())
+ self.assertEqual(C1[str, T].__parameters__, (T,))
+ self.assertEqual(C1[Concatenate[str, P2]].__parameters__, (P2,))
+ self.assertEqual(C1[Concatenate[T, P2]].__parameters__, (T, P2))
+ self.assertEqual(C1[...].__parameters__, ())
+
+ C2 = Callable[Concatenate[str, P], int]
+ self.assertEqual(C2.__parameters__, (P,))
+ self.assertEqual(C2[P2].__parameters__, (P2,))
+ self.assertEqual(C2[str].__parameters__, ())
+ self.assertEqual(C2[str, T].__parameters__, (T,))
+ self.assertEqual(C2[Concatenate[str, P2]].__parameters__, (P2,))
+ self.assertEqual(C2[Concatenate[T, P2]].__parameters__, (T, P2))
+
class ConcatenateTests(BaseTestCase):
def test_basics(self):
diff --git a/Lib/typing.py b/Lib/typing.py
index abb8bce..e301556 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -670,7 +670,9 @@ def Concatenate(self, parameters):
"ParamSpec variable.")
msg = "Concatenate[arg, ...]: each arg must be a type."
parameters = (*(_type_check(p, msg) for p in parameters[:-1]), parameters[-1])
- return _ConcatenateGenericAlias(self, parameters)
+ return _ConcatenateGenericAlias(self, parameters,
+ _typevar_types=(TypeVar, ParamSpec),
+ _paramspec_tvars=True)
@_SpecialForm
@@ -1339,7 +1341,9 @@ class _GenericAlias(_BaseGenericAlias, _root=True):
return tuple(new_args)
def copy_with(self, args):
- return self.__class__(self.__origin__, args, name=self._name, inst=self._inst)
+ return self.__class__(self.__origin__, args, name=self._name, inst=self._inst,
+ _typevar_types=self._typevar_types,
+ _paramspec_tvars=self._paramspec_tvars)
def __repr__(self):
if self._name:
@@ -1548,11 +1552,6 @@ class _LiteralGenericAlias(_GenericAlias, _root=True):
class _ConcatenateGenericAlias(_GenericAlias, _root=True):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs,
- _typevar_types=(TypeVar, ParamSpec),
- _paramspec_tvars=True)
-
def copy_with(self, params):
if isinstance(params[-1], (list, tuple)):
return (*params[:-1], *params[-1])
diff --git a/Misc/ACKS b/Misc/ACKS
index df851bb..84fcb32 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -190,6 +190,7 @@ Paul Boddie
Matthew Boedicker
Robin Boerdijk
Andra Bogildea
+Matt Bogosian
Nikolay Bogoychev
David Bolen
Wouter Bolsterlee
diff --git a/Misc/NEWS.d/next/Library/2022-02-01-11-32-47.bpo-46581.t7Zw65.rst b/Misc/NEWS.d/next/Library/2022-02-01-11-32-47.bpo-46581.t7Zw65.rst
new file mode 100644
index 0000000..1982c1d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-02-01-11-32-47.bpo-46581.t7Zw65.rst
@@ -0,0 +1,2 @@
+Brings :class:`ParamSpec` propagation for :class:`GenericAlias` in line with
+:class:`Concatenate` (and others).