@@ -3543,25 +3543,40 @@ def __getitem__(self, parameters):
35433543 else :
35443544 def _check_parameter (self , item , typ = _marker ):
35453545 # Allow [], [int], [int, str], [int, ...], [int, T]
3546- if not isinstance (typ , ParamSpec ) and typ is not _marker :
3547- return typing ._type_check (
3548- item , f'Subscripting { self .__name__ } requires a type.'
3546+ if isinstance (item , _UnpackAlias ):
3547+ args = (
3548+ item .__args__ # e.g. (int, str)
3549+ if sys .version_info [:2 ] >= (3 , 9 )
3550+ else item .__args__ # (typing.Tuple[int, float],)
35493551 )
3550- if item is ...:
3551- return ...
3552+ # Unpack
3553+ yield from [checked
3554+ for arg in args
3555+ for checked in self ._check_parameter (arg )]
3556+ elif item is ...:
3557+ yield ...
35523558 elif isinstance (item , list ) and typ is not _marker :
3553- return [self ._check_parameter (arg ) for arg in item ]
3559+ yield [checked
3560+ for arg in item
3561+ for checked in self ._check_parameter (arg )]
35543562 else :
3555- return typing ._type_check (
3563+ yield typing ._type_check (
35563564 item , f'Subscripting { self .__name__ } requires a type.'
35573565 )
35583566
35593567 def __getitem__ (self , parameters ):
35603568 if not isinstance (parameters , tuple ):
35613569 parameters = (parameters ,)
3570+ param_difference = (len (parameters ) - len (self .__type_params__ ))
3571+ if param_difference > 0 :
3572+ # invalid case that does not raise an error, fill with dummys
3573+ type_params = [* self .__type_params__ , * [Any ] * param_difference ]
3574+ else :
3575+ type_params = self .__type_params__
35623576 parameters = [
3563- self ._check_parameter (item , typ )
3564- for item , typ in zip (parameters , self .__type_params__ )
3577+ checked
3578+ for item , typ in zip (parameters , type_params )
3579+ for checked in self ._check_parameter (item , typ )
35653580 ]
35663581 alias = typing ._GenericAlias (self , tuple (parameters ))
35673582 alias .__name__ = self .__name__
0 commit comments