diff --git a/src/test_typing_extensions.py b/src/test_typing_extensions.py index 8c2726f8..d028a3a7 100644 --- a/src/test_typing_extensions.py +++ b/src/test_typing_extensions.py @@ -5401,6 +5401,18 @@ def test_invalid_uses(self): ): Concatenate[1, P] + @skipUnless(TYPING_3_10_0, "Missing backported to <=3.9. See issue #48") + def test_alias_subscription_with_ellipsis(self): + P = ParamSpec('P') + X = Callable[Concatenate[int, P], Any] + + C1 = X[...] + self.assertEqual(C1.__parameters__, ()) + with self.subTest("Compare Concatenate[int, ...]"): + if sys.version_info[:2] == (3, 10): + self.skipTest("Needs Issue #110 | PR # 442: construct Concatenate with ...") + self.assertEqual(get_args(C1), (Concatenate[int, ...], Any)) + def test_basic_introspection(self): P = ParamSpec('P') C1 = Concatenate[int, P] diff --git a/src/typing_extensions.py b/src/typing_extensions.py index 5bf4f2dc..fb836461 100644 --- a/src/typing_extensions.py +++ b/src/typing_extensions.py @@ -1795,7 +1795,24 @@ def __parameters__(self): return tuple( tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec)) ) +# 3.10+ +else: + _ConcatenateGenericAlias = typing._ConcatenateGenericAlias + # 3.10 + # Monkey patch to not raise TypeError on python3.10 for ellipsis parameter + if sys.version_info < (3, 11): + def _copy_with_support_ellipsis(self, params): + if isinstance(params[-1], (list, tuple)): + return (*params[:-1], *params[-1]) + if isinstance(params[-1], _ConcatenateGenericAlias): + params = (*params[:-1], *params[-1].__args__) + elif not (params[-1] is ... or isinstance(params[-1], ParamSpec)): + raise TypeError("The last parameter to Concatenate should be a " + "ParamSpec variable or ellipsis.") + return super(_ConcatenateGenericAlias, self).copy_with(params) + + _ConcatenateGenericAlias.copy_with = _copy_with_support_ellipsis # 3.8-3.9 @typing._tp_cache