@@ -8314,19 +8314,28 @@ def conditional_types(
83148314 proper_type = get_proper_type (current_type )
83158315 # factorize over union types: isinstance(A|B, C) -> yes = A_yes | B_yes
83168316 if isinstance (proper_type , UnionType ):
8317- result : list [tuple [Type | None , Type | None ]] = [
8318- conditional_types (
8317+ yes_items : list [Type ] | None = []
8318+ no_items : list [Type ] | None = []
8319+ for union_item in proper_type .items :
8320+ yes_type , no_type = conditional_types (
83198321 union_item ,
83208322 proposed_type_ranges ,
83218323 default = union_item ,
83228324 consider_runtime_isinstance = consider_runtime_isinstance ,
83238325 consider_promotion_overlap = consider_promotion_overlap ,
83248326 )
8325- for union_item in get_proper_types (proper_type .items )
8326- ]
8327- # separate list of tuples into two lists
8328- yes_types , no_types = zip (* result )
8329- proposed_type = make_simplified_union ([t for t in yes_types if t is not None ])
8327+ if yes_type is None :
8328+ yes_items = None
8329+ elif yes_items is not None :
8330+ yes_items .append (yes_type )
8331+ if no_type is None :
8332+ no_items = None
8333+ elif no_items is not None :
8334+ no_items .append (no_type )
8335+
8336+ proposed_type = make_simplified_union (yes_items ) if yes_items is not None else None
8337+ remaining_type = make_simplified_union (no_items ) if no_items is not None else None
8338+ return proposed_type , remaining_type
83308339 else :
83318340 proposed_items = [type_range .item for type_range in proposed_type_ranges ]
83328341 proposed_type = make_simplified_union (proposed_items )
0 commit comments