]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40397: Fix subscription of nested generic alias without parameters. (GH-20021)
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 10 May 2020 10:39:40 +0000 (13:39 +0300)
committerGitHub <noreply@github.com>
Sun, 10 May 2020 10:39:40 +0000 (13:39 +0300)
Lib/test/test_typing.py
Lib/typing.py

index 21bc7c81f2a30ed9f2b80c856547b732ebe1bc06..f429e883b595384dd62e1a83ca0062461e1a0e61 100644 (file)
@@ -10,7 +10,7 @@ from typing import Any, NoReturn
 from typing import TypeVar, AnyStr
 from typing import T, KT, VT  # Not in __all__.
 from typing import Union, Optional, Literal
-from typing import Tuple, List, MutableMapping
+from typing import Tuple, List, Dict, MutableMapping
 from typing import Callable
 from typing import Generic, ClassVar, Final, final, Protocol
 from typing import cast, runtime_checkable
@@ -3173,6 +3173,17 @@ class CollectionsAbcTests(BaseTestCase):
     def test_dict(self):
         self.assertIsSubclass(dict, typing.Dict)
 
+    def test_dict_subscribe(self):
+        K = TypeVar('K')
+        V = TypeVar('V')
+        self.assertEqual(Dict[K, V][str, int], Dict[str, int])
+        self.assertEqual(Dict[K, int][str], Dict[str, int])
+        self.assertEqual(Dict[str, V][int], Dict[str, int])
+        self.assertEqual(Dict[K, List[V]][str, int], Dict[str, List[int]])
+        self.assertEqual(Dict[K, List[int]][str], Dict[str, List[int]])
+        self.assertEqual(Dict[K, list[V]][str, int], Dict[str, list[int]])
+        self.assertEqual(Dict[K, list[int]][str], Dict[str, list[int]])
+
     def test_no_list_instantiation(self):
         with self.assertRaises(TypeError):
             typing.List()
index e31fc99e02245e91e8fadc7fa87efd8e76cec4e5..b5ba38e07c835bc812dabb726b6ff92d38eb2620 100644 (file)
@@ -702,8 +702,10 @@ class _GenericAlias(_BaseGenericAlias, _root=True):
             if isinstance(arg, TypeVar):
                 arg = subst[arg]
             elif isinstance(arg, (_GenericAlias, GenericAlias)):
-                subargs = tuple(subst[x] for x in arg.__parameters__)
-                arg = arg[subargs]
+                subparams = arg.__parameters__
+                if subparams:
+                    subargs = tuple(subst[x] for x in subparams)
+                    arg = arg[subargs]
             new_args.append(arg)
         return self.copy_with(tuple(new_args))