Bug Report
If a NamedTuple is generic over T, then for some reason, inside a match statement over this NamedTuple, all information about member variables and their types are erased. Even if they are explicitly stated.
To Reproduce
from typing import NamedTuple
class Wrapper[T](NamedTuple):
wrap: T
foo: Wrapper[int] = Wrapper(123)
def bar() -> int:
match foo:
case Wrapper(wrap=w):
return w
case _: # this is only to make this error-less with `pyrefly`
raise RuntimeError("Unreachable")
Expected Behavior
This function clearly matches a Wrapper[int] in its first case. It should detect it can match the internal wrap variable, and it also has to be int.
$ pyrefly check tst.py
INFO 0 errors
$ pyright tst.py
0 errors, 0 warnings, 0 informations
Actual Behavior
mypy for some reason seems to say that Wrapper does not even have a wrap attribute, and also, it's saying that this is Any, even though the matched Wrapper here is Wrapper[int].
$ mypy --strict tst.py
tst.py:12: error: Class "tst.Wrapper[Any]" has no attribute "wrap" [misc]
tst.py:13: error: Returning Any from function declared to return "int" [no-any-return]
Your Environment
- Mypy version used: 1.19.1
- Mypy command-line flags:
--strict
- Python version used: 3.12.9
Bug Report
If a
NamedTupleis generic overT, then for some reason, inside amatchstatement over thisNamedTuple, all information about member variables and their types are erased. Even if they are explicitly stated.To Reproduce
Expected Behavior
This function clearly matches a
Wrapper[int]in its first case. It should detect it can match the internalwrapvariable, and it also has to beint.Actual Behavior
mypyfor some reason seems to say thatWrapperdoes not even have awrapattribute, and also, it's saying that this isAny, even though the matchedWrapperhere isWrapper[int].Your Environment
--strict