@@ -2340,10 +2340,13 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False,
23402340 # *base_globals* first rather than *base_locals*.
23412341 # This only affects ForwardRefs.
23422342 base_globals , base_locals = base_locals , base_globals
2343+ type_params = base .__type_params__
2344+ base_globals , base_locals = _add_type_params_to_scope (
2345+ type_params , base_globals , base_locals , True )
23432346 for name , value in ann .items ():
23442347 if isinstance (value , str ):
23452348 value = _make_forward_ref (value , is_argument = False , is_class = True )
2346- value = _eval_type (value , base_globals , base_locals , base . __type_params__ ,
2349+ value = _eval_type (value , base_globals , base_locals , () ,
23472350 format = format , owner = obj )
23482351 if value is None :
23492352 value = type (None )
@@ -2379,6 +2382,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False,
23792382 elif localns is None :
23802383 localns = globalns
23812384 type_params = getattr (obj , "__type_params__" , ())
2385+ globalns , localns = _add_type_params_to_scope (type_params , globalns , localns , False )
23822386 for name , value in hints .items ():
23832387 if isinstance (value , str ):
23842388 # class-level forward refs were handled above, this must be either
@@ -2388,13 +2392,27 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False,
23882392 is_argument = not isinstance (obj , types .ModuleType ),
23892393 is_class = False ,
23902394 )
2391- value = _eval_type (value , globalns , localns , type_params , format = format , owner = obj )
2395+ value = _eval_type (value , globalns , localns , () , format = format , owner = obj )
23922396 if value is None :
23932397 value = type (None )
23942398 hints [name ] = value
23952399 return hints if include_extras else {k : _strip_annotations (t ) for k , t in hints .items ()}
23962400
23972401
2402+ # Add type parameters to the globals and locals scope. This is needed for
2403+ # compatibility.
2404+ def _add_type_params_to_scope (type_params , globalns , localns , is_class ):
2405+ if not type_params :
2406+ return globalns , localns
2407+ globalns = dict (globalns )
2408+ localns = dict (localns )
2409+ for param in type_params :
2410+ if not is_class or param .__name__ not in globalns :
2411+ globalns [param .__name__ ] = param
2412+ localns .pop (param .__name__ , None )
2413+ return globalns , localns
2414+
2415+
23982416def _strip_annotations (t ):
23992417 """Strip the annotations from a given type."""
24002418 if isinstance (t , _AnnotatedAlias ):
0 commit comments