summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2022-04-29 21:01:40 (GMT)
committerGitHub <noreply@github.com>2022-04-29 21:01:40 (GMT)
commit81120b6754c67a8f1f00cbc3af6963c0e1945911 (patch)
treebc93c2acfa17ba7829421404c20f34d5767cd9a0 /Lib
parentf6656163de483003697d510031827b7512056d55 (diff)
downloadcpython-81120b6754c67a8f1f00cbc3af6963c0e1945911.zip
cpython-81120b6754c67a8f1f00cbc3af6963c0e1945911.tar.gz
cpython-81120b6754c67a8f1f00cbc3af6963c0e1945911.tar.bz2
bpo-44791: Accept ellipsis as the last argument of typing.Concatenate (#30969)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_typing.py12
-rw-r--r--Lib/typing.py7
2 files changed, 6 insertions, 13 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index dab549b..929f0df 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -1755,8 +1755,7 @@ class BaseCallableTests:
self.assertEqual(C[[], int], Callable[[int], int])
self.assertEqual(C[Concatenate[str, P2], int],
Callable[Concatenate[int, str, P2], int])
- with self.assertRaises(TypeError):
- C[..., int]
+ self.assertEqual(C[..., int], Callable[Concatenate[int, ...], int])
C = Callable[Concatenate[int, P], int]
self.assertEqual(repr(C),
@@ -1767,8 +1766,7 @@ class BaseCallableTests:
self.assertEqual(C[[]], Callable[[int], int])
self.assertEqual(C[Concatenate[str, P2]],
Callable[Concatenate[int, str, P2], int])
- with self.assertRaises(TypeError):
- C[...]
+ self.assertEqual(C[...], Callable[Concatenate[int, ...], int])
def test_errors(self):
Callable = self.Callable
@@ -6739,8 +6737,7 @@ class ConcatenateTests(BaseTestCase):
self.assertEqual(C[int, []], (int,))
self.assertEqual(C[int, Concatenate[str, P2]],
Concatenate[int, str, P2])
- with self.assertRaises(TypeError):
- C[int, ...]
+ self.assertEqual(C[int, ...], Concatenate[int, ...])
C = Concatenate[int, P]
self.assertEqual(C[P2], Concatenate[int, P2])
@@ -6748,8 +6745,7 @@ class ConcatenateTests(BaseTestCase):
self.assertEqual(C[str, float], (int, str, float))
self.assertEqual(C[[]], (int,))
self.assertEqual(C[Concatenate[str, P2]], Concatenate[int, str, P2])
- with self.assertRaises(TypeError):
- C[...]
+ self.assertEqual(C[...], Concatenate[int, ...])
class TypeGuardTests(BaseTestCase):
def test_basics(self):
diff --git a/Lib/typing.py b/Lib/typing.py
index f4d4fa4..b250f29 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -714,9 +714,9 @@ def Concatenate(self, parameters):
raise TypeError("Cannot take a Concatenate of no types.")
if not isinstance(parameters, tuple):
parameters = (parameters,)
- if not isinstance(parameters[-1], ParamSpec):
+ if not (parameters[-1] is ... or isinstance(parameters[-1], ParamSpec)):
raise TypeError("The last parameter to Concatenate should be a "
- "ParamSpec variable.")
+ "ParamSpec variable or ellipsis.")
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,
@@ -1641,9 +1641,6 @@ class _ConcatenateGenericAlias(_GenericAlias, _root=True):
return (*params[:-1], *params[-1])
if isinstance(params[-1], _ConcatenateGenericAlias):
params = (*params[:-1], *params[-1].__args__)
- elif not isinstance(params[-1], ParamSpec):
- raise TypeError("The last parameter to Concatenate should be a "
- "ParamSpec variable.")
return super().copy_with(params)