Skip to content

Commit b6fefb0

Browse files
committed
Correct subscription handling when type_params are empty
1 parent 5c0938c commit b6fefb0

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/test_typing_extensions.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7457,6 +7457,24 @@ def test_invalid_cases_before_3_11(self):
74577457
with self.assertRaises(TypeError):
74587458
ListOrSetT[(Generic[T], )]
74597459

7460+
def test_subscription_without_type_params(self):
7461+
Simple = TypeAliasType("Simple", int)
7462+
with self.assertRaises(TypeError, msg="Only generic type aliases are subscriptable"):
7463+
Simple[int]
7464+
with self.assertRaises(TypeError, msg="Only generic type aliases are subscriptable"):
7465+
Simple[[]]
7466+
with self.assertRaises(TypeError, msg="Only generic type aliases are subscriptable"):
7467+
Simple[()]
7468+
7469+
# no TypeVar in type_params, however in value still allows subscription
7470+
T = TypeVar("T")
7471+
MissingTypeParams = TypeAliasType("MissingTypeParams", List[T], type_params=())
7472+
self.assertEqual(MissingTypeParams.__type_params__, ())
7473+
self.assertEqual(MissingTypeParams.__parameters__, ())
7474+
# These should not raise:
7475+
MissingTypeParams[int]
7476+
MissingTypeParams[[]]
7477+
MissingTypeParams[()]
74607478

74617479
def test_pickle(self):
74627480
global Alias

src/typing_extensions.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3526,9 +3526,22 @@ def _raise_attribute_error(self, name: str) -> Never:
35263526
def __repr__(self) -> str:
35273527
return self.__name__
35283528

3529+
def _is_subscriptable(self):
3530+
if len(self.__parameters__) > 0:
3531+
return True
3532+
if _should_collect_from_parameters(self.__value__):
3533+
if hasattr(typing, '_collect_type_vars'):
3534+
more_parameters = _collect_type_vars((self.__value__,),
3535+
(TypeVar, ParamSpec))
3536+
else:
3537+
more_parameters = _collect_parameters((self.__value__,))
3538+
if more_parameters:
3539+
return True
3540+
return False
3541+
35293542
if sys.version_info >= (3, 11):
35303543
def __getitem__(self, parameters):
3531-
if len(self.__type_params__) == 0:
3544+
if len(self.__parameters__) == 0 and not self._is_subscriptable():
35323545
raise TypeError("Only generic type aliases are subscriptable")
35333546
if not isinstance(parameters, tuple):
35343547
parameters = (parameters,)
@@ -3562,7 +3575,7 @@ def _check_parameter(self, item, recursion=0):
35623575
)
35633576

35643577
def __getitem__(self, parameters):
3565-
if len(self.__type_params__) == 0:
3578+
if len(self.__parameters__) == 0 and not self._is_subscriptable():
35663579
raise TypeError("Only generic type aliases are subscriptable")
35673580
if not isinstance(parameters, tuple):
35683581
parameters = (parameters,)

0 commit comments

Comments
 (0)