[match-case] mypy ignores missing `@runtime_checkable` in class-pattern
Open
Nobody has claimed this yet.
bug
topic-match-statement
topic-runtime-semantics
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
from typing import Any, Callable, Protocol, runtime_checkable
class Proto(Protocol):
def foo(self, x: int, /) -> object: ...
def test_object(x: object) -> None:
match x:
case Proto() as y: # No Error
reveal_type(y) # N: Revealed type is "__main__.Proto"
if isinstance(x, Proto): # E: Only @runtime_checkable protocols ...
reveal_type(x) # N: Revealed type is "__main__.Proto"
https://mypy-play.net/?mypy=latest&python=3.12&gist=6e3f280e71d3cb4d6131e51496370f97
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the minimal Python 3.12 example from the issue in the linked mypy-playground, comparing the class-pattern behavior with the isinstance check. Trace mypy's match-case analysis for protocol patterns; done means a missing @runtime_checkable protocol is diagnosed consistently with isinstance.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100