@@ -986,6 +986,10 @@ def check_typeddict_call_with_kwargs(
986986 always_present_keys : set [str ],
987987 ) -> Type :
988988 actual_keys = kwargs .keys ()
989+ if callee .to_be_mutated :
990+ assigned_readonly_keys = actual_keys & callee .readonly_keys
991+ if assigned_readonly_keys :
992+ self .msg .readonly_keys_mutated (assigned_readonly_keys , context = context )
989993 if not (
990994 callee .required_keys <= always_present_keys and actual_keys <= callee .items .keys ()
991995 ):
@@ -4349,7 +4353,7 @@ def visit_index_with_type(
43494353 else :
43504354 return self .nonliteral_tuple_index_helper (left_type , index )
43514355 elif isinstance (left_type , TypedDictType ):
4352- return self .visit_typeddict_index_expr (left_type , e .index )
4356+ return self .visit_typeddict_index_expr (left_type , e .index )[ 0 ]
43534357 elif isinstance (left_type , FunctionLike ) and left_type .is_type_obj ():
43544358 if left_type .type_object ().is_enum :
43554359 return self .visit_enum_index_expr (left_type .type_object (), e .index , e )
@@ -4530,7 +4534,7 @@ def union_tuple_fallback_item(self, left_type: TupleType) -> Type:
45304534
45314535 def visit_typeddict_index_expr (
45324536 self , td_type : TypedDictType , index : Expression , setitem : bool = False
4533- ) -> Type :
4537+ ) -> tuple [ Type , set [ str ]] :
45344538 if isinstance (index , StrExpr ):
45354539 key_names = [index .value ]
45364540 else :
@@ -4553,17 +4557,17 @@ def visit_typeddict_index_expr(
45534557 key_names .append (key_type .value )
45544558 else :
45554559 self .msg .typeddict_key_must_be_string_literal (td_type , index )
4556- return AnyType (TypeOfAny .from_error )
4560+ return AnyType (TypeOfAny .from_error ), set ()
45574561
45584562 value_types = []
45594563 for key_name in key_names :
45604564 value_type = td_type .items .get (key_name )
45614565 if value_type is None :
45624566 self .msg .typeddict_key_not_found (td_type , key_name , index , setitem )
4563- return AnyType (TypeOfAny .from_error )
4567+ return AnyType (TypeOfAny .from_error ), set ()
45644568 else :
45654569 value_types .append (value_type )
4566- return make_simplified_union (value_types )
4570+ return make_simplified_union (value_types ), set ( key_names )
45674571
45684572 def visit_enum_index_expr (
45694573 self , enum_type : TypeInfo , index : Expression , context : Context
0 commit comments