Skip to content

Commit f9a2055

Browse files
authored
Fix recursive use of Concatenate when mixing modules (python#512)
1 parent ca41832 commit f9a2055

File tree

3 files changed

+18
-4
lines changed

3 files changed

+18
-4
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ aliases that have a `Concatenate` special form as their argument.
2929
- Fix that lists and ... could not be used for parameter expressions for `TypeAliasType`
3030
instances before Python 3.11.
3131
Patch by [Daraan](https://github.com/Daraan).
32+
- Fix error on Python 3.10 when using `typing.Concatenate` and
33+
`typing_extensions.Concatenate` together. Patch by [Daraan](https://github.com/Daraan).
3234

3335
# Release 4.12.2 (June 7, 2024)
3436

src/test_typing_extensions.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5504,6 +5504,19 @@ class MyClass: ...
55045504
self.assertNotEqual(d, c)
55055505
self.assertNotEqual(d, Concatenate)
55065506

5507+
@skipUnless(TYPING_3_10_0, "Concatenate not available in <3.10")
5508+
def test_typing_compatibility(self):
5509+
P = ParamSpec('P')
5510+
C1 = Concatenate[int, P][typing.Concatenate[int, P]]
5511+
self.assertEqual(C1, Concatenate[int, int, P])
5512+
self.assertEqual(get_args(C1), (int, int, P))
5513+
5514+
C2 = typing.Concatenate[int, P][Concatenate[int, P]]
5515+
with self.subTest("typing compatibility with typing_extensions"):
5516+
if sys.version_info < (3, 10, 3):
5517+
self.skipTest("Unpacking not introduced until 3.10.3")
5518+
self.assertEqual(get_args(C2), (int, int, P))
5519+
55075520
def test_valid_uses(self):
55085521
P = ParamSpec('P')
55095522
T = TypeVar('T')

src/typing_extensions.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,21 +1908,20 @@ def __getitem__(self, args):
19081908

19091909
# 3.10
19101910
if sys.version_info < (3, 11):
1911-
_typing_ConcatenateGenericAlias = _ConcatenateGenericAlias
19121911

1913-
class _ConcatenateGenericAlias(_typing_ConcatenateGenericAlias, _root=True):
1912+
class _ConcatenateGenericAlias(typing._ConcatenateGenericAlias, _root=True):
19141913
# needed for checks in collections.abc.Callable to accept this class
19151914
__module__ = "typing"
19161915

19171916
def copy_with(self, params):
19181917
if isinstance(params[-1], (list, tuple)):
19191918
return (*params[:-1], *params[-1])
1920-
if isinstance(params[-1], _ConcatenateGenericAlias):
1919+
if isinstance(params[-1], typing._ConcatenateGenericAlias):
19211920
params = (*params[:-1], *params[-1].__args__)
19221921
elif not (params[-1] is ... or isinstance(params[-1], ParamSpec)):
19231922
raise TypeError("The last parameter to Concatenate should be a "
19241923
"ParamSpec variable or ellipsis.")
1925-
return super(_typing_ConcatenateGenericAlias, self).copy_with(params)
1924+
return super(typing._ConcatenateGenericAlias, self).copy_with(params)
19261925

19271926
def __getitem__(self, args):
19281927
value = super().__getitem__(args)

0 commit comments

Comments
 (0)