@@ -3452,6 +3452,37 @@ def _is_unionable(obj):
34523452 TypeAliasType ,
34533453 ))
34543454
3455+ if sys .version_info < (3 , 10 ):
3456+ # Copied and pasted from https://github.com/python/cpython/blob/986a4e1b6fcae7fe7a1d0a26aea446107dd58dd2/Objects/genericaliasobject.c#L568-L582,
3457+ # so that we emulate the behaviour of `types.GenericAlias`
3458+ # on the latest versions of CPython
3459+ _ATTRIBUTE_DELEGATION_EXCLUSIONS = frozenset ({
3460+ "__class__" ,
3461+ "__bases__" ,
3462+ "__origin__" ,
3463+ "__args__" ,
3464+ "__unpacked__" ,
3465+ "__parameters__" ,
3466+ "__typing_unpacked_tuple_args__" ,
3467+ "__mro_entries__" ,
3468+ "__reduce_ex__" ,
3469+ "__reduce__" ,
3470+ "__copy__" ,
3471+ "__deepcopy__" ,
3472+ })
3473+
3474+ class _TypeAliasGenericAlias (typing ._GenericAlias , _root = True ):
3475+ def __getattr__ (self , attr ):
3476+ if attr in _ATTRIBUTE_DELEGATION_EXCLUSIONS :
3477+ return object .__getattr__ (self , attr )
3478+ return getattr (self .__origin__ , attr )
3479+
3480+ if sys .version_info < (3 , 9 ):
3481+ def __getitem__ (self , item ):
3482+ result = super ().__getitem__ (item )
3483+ result .__class__ = type (self )
3484+ return result
3485+
34553486 class TypeAliasType :
34563487 """Create named, parameterized type aliases.
34573488
@@ -3543,25 +3574,28 @@ def _check_single_param(self, param, recursion=0):
35433574
35443575 def _check_parameters (self , parameters ):
35453576 if sys .version_info < (3 , 11 ):
3546- return [
3577+ return tuple (
35473578 checked
35483579 for item in parameters
35493580 for checked in self ._check_single_param (item )
3550- ]
3551- return [ typing ._type_check (
3581+ )
3582+ return tuple ( typing ._type_check (
35523583 item , f'Subscripting { self .__name__ } requires a type.'
35533584 )
35543585 for item in parameters
3555- ]
3586+ )
35563587
35573588 def __getitem__ (self , parameters ):
3589+ if not self .__type_params__ :
3590+ raise TypeError ("Only generic type aliases are subscriptable" )
35583591 if not isinstance (parameters , tuple ):
35593592 parameters = (parameters ,)
3593+ # Using 3.9 here will create problems with Concatenate
35603594 if sys .version_info >= (3 , 10 ):
3561- return _types .GenericAlias (self , tuple (parameters ))
3595+ return _types .GenericAlias (self , parameters )
3596+ parameters = tuple (self ._check_parameters (parameters ))
3597+ return typing ._GenericAlias (self , tuple (parameters ))
35623598 type_vars = _collect_type_vars (parameters )
3563- parameters = self ._check_parameters (parameters )
3564- alias = typing ._GenericAlias (self , tuple (parameters ))
35653599 if len (alias .__parameters__ ) < len (type_vars ):
35663600 alias .__parameters__ = tuple (type_vars )
35673601 return alias
0 commit comments