-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Open
Labels
topic-match-statementPython 3.10's match statementPython 3.10's match statementtopic-reachabilityDetecting unreachable codeDetecting unreachable code
Description
I feel like this code should work but it doesn't. Am I missing something?
from typing_extensions import assert_never
class Left1:
pass
class Left2:
pass
class Right1:
pass
class Right2:
pass
# this function should take either left1+right1, or left2+right2
def foo(pair: tuple[Left1, Right1] | tuple[Left2, Right2]) -> str:
match thing:
case (Left1(), Right1()):
return "1"
case (Left2(), Right2()):
return "2"
case _:
# at this point, we should have exhausted both possibilities in the union.
assert_never(pair)
gives
src/pairs.py:27: error: Argument 1 to "assert_never" has incompatible type "Union[Tuple[Left1, Right1], Tuple[Left2, Right2]]"; expected "NoReturn" [arg-type]
glyph
Metadata
Metadata
Assignees
Labels
topic-match-statementPython 3.10's match statementPython 3.10's match statementtopic-reachabilityDetecting unreachable codeDetecting unreachable code
Projects
Milestone
Relationships
Development
Select code repository
Activity
JelleZijlstra commentedon Jan 29, 2024
This should be reported to your type checker (probably mypy); it's not an issue with typing-extensions which just provides the runtime version of
assert_never
.I'll transfer the issue to mypy as I don't recall seeing it before.
hjwp commentedon Jan 29, 2024
thanks very much for transferring! I didn't realise you could do that. much appreciated :)
Hnasar commentedon Jan 30, 2024
This seems like a duplicate of #15190
JelleZijlstra commentedon Jan 30, 2024
It's similar but unlike #15190 this one doesn't involve Literal.
[-]assert_never on exclusive union of tuples[/-][+]assert_never on exclusive union of tuples (type narrowing issue?)[/+]