From ab01bf7e615c3003998eb832993256a10c784817 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 27 Nov 2024 19:08:55 +0100 Subject: [PATCH 1/3] Fix nested use of Concatenate from both modules --- src/test_typing_extensions.py | 7 +++++++ src/typing_extensions.py | 7 +++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/test_typing_extensions.py b/src/test_typing_extensions.py index 1b43f90f..cac27477 100644 --- a/src/test_typing_extensions.py +++ b/src/test_typing_extensions.py @@ -5373,6 +5373,13 @@ class MyClass: ... self.assertNotEqual(d, c) self.assertNotEqual(d, Concatenate) + @skipUnless(TYPING_3_10_0, "Concatenate not available in <3.10") + def test_typing_compatibility(self): + P = ParamSpec('P') + C = Concatenate[int, P][typing.Concatenate[int, P]] + self.assertEqual(C, Concatenate[int, int, P]) + self.assertEqual(get_args(C), (int, int, P)) + def test_valid_uses(self): P = ParamSpec('P') T = TypeVar('T') diff --git a/src/typing_extensions.py b/src/typing_extensions.py index c5e84b31..e999e37b 100644 --- a/src/typing_extensions.py +++ b/src/typing_extensions.py @@ -1801,21 +1801,20 @@ def __parameters__(self): # 3.10 if sys.version_info < (3, 11): - _typing_ConcatenateGenericAlias = _ConcatenateGenericAlias - class _ConcatenateGenericAlias(_typing_ConcatenateGenericAlias, _root=True): + class _ConcatenateGenericAlias(typing._ConcatenateGenericAlias, _root=True): # needed for checks in collections.abc.Callable to accept this class __module__ = "typing" def copy_with(self, params): if isinstance(params[-1], (list, tuple)): return (*params[:-1], *params[-1]) - if isinstance(params[-1], _ConcatenateGenericAlias): + if isinstance(params[-1], typing._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(_typing_ConcatenateGenericAlias, self).copy_with(params) + return super(typing._ConcatenateGenericAlias, self).copy_with(params) # 3.8-3.9.2 From 31328bad7d11b774531f79bb3eda82383a8b5254 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 28 Nov 2024 10:38:23 +0100 Subject: [PATCH 2/3] Add second compatibility check --- src/test_typing_extensions.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/test_typing_extensions.py b/src/test_typing_extensions.py index e8a54f28..ee04830f 100644 --- a/src/test_typing_extensions.py +++ b/src/test_typing_extensions.py @@ -5376,9 +5376,15 @@ class MyClass: ... @skipUnless(TYPING_3_10_0, "Concatenate not available in <3.10") def test_typing_compatibility(self): P = ParamSpec('P') - C = Concatenate[int, P][typing.Concatenate[int, P]] - self.assertEqual(C, Concatenate[int, int, P]) - self.assertEqual(get_args(C), (int, int, P)) + C1 = Concatenate[int, P][typing.Concatenate[int, P]] + self.assertEqual(C1, Concatenate[int, int, P]) + self.assertEqual(get_args(C1), (int, int, P)) + + C2 = typing.Concatenate[int, P][Concatenate[int, P]] + with self.subTest("typing compatibility with typing_extensions"): + if sys.version_info < (3, 10, 3): + self.skipTest("Unpacking not introduced until 3.10.3") + self.assertEqual(get_args(C2), (int, int, P)) def test_valid_uses(self): P = ParamSpec('P') From a830b4290429e31f639ae27a71d30e4ce72da121 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 28 Nov 2024 10:38:35 +0100 Subject: [PATCH 3/3] Update Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6333d7b1..4c11f96b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ aliases that have a `Concatenate` special form as their argument. - Fix that lists and ... could not be used for parameter expressions for `TypeAliasType` instances before Python 3.11. Patch by [Daraan](https://github.com/Daraan). +- Fix error on Python 3.10 when using `typing.Concatenate` and + `typing_extensions.Concatenate` together. Patch by [Daraan](https://github.com/Daraan). # Release 4.12.2 (June 7, 2024)