FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Improve match statement union narrowing/inference by bergkvist · Pull Request #17600 · python/mypy · GitHub

Repository navigation

21 changes: 21 additions & 0 deletions mypy/checkpattern.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,27 @@ def visit_sequence_pattern(self, o: SequencePattern) -> PatternType:
# get inner types of original type
#
unpack_index = None

if isinstance(current_type, UnionType):
union_captures: dict[Expression, Type] = {}
union_items: list[Type] = []
for t in current_type.items:
typ, _, capture = self.accept(o, t)
if not is_uninhabited(get_proper_type(typ)):
union_items.append(typ)
union_captures.update(capture)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

hmm shouldn't the values in union_captures be a union of all the things, instead of potentially clobbering?


rest_items: list[Type] = []

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

iiuc this should use conditional_types_with_intersection

for item in current_type.items:
if all(used_item != item for used_item in union_items):
rest_items.append(item)

return PatternType(
type=UnionType.make_union(items=union_items),
rest_type=UnionType.make_union(items=rest_items),
captures=union_captures,
)

if isinstance(current_type, TupleType):
inner_types = current_type.items
unpack_index = find_unpack_in_list(inner_types)
Expand Down
5 changes: 2 additions & 3 deletions test-data/unit/check-python310.test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -2181,12 +2181,11 @@ match foo:
[case testMatchUnionTwoTuplesNoCrash]
var: tuple[int, int] | tuple[str, str]

# TODO: we can infer better here.
match var:
case (42, a):
reveal_type(a) # N: Revealed type is "builtins.int | builtins.str"
reveal_type(a) # N: Revealed type is "builtins.int"
case ("yes", b):
reveal_type(b) # N: Revealed type is "builtins.int | builtins.str"
reveal_type(b) # N: Revealed type is "builtins.str"
[builtins fixtures/tuple.pyi]

[case testMatchNamedAndKeywordsAreTheSame]
Expand Down

Back | FazBrowse Home | New Git URL