You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I was trying to use a Protocol to fish out the value type from a TypedDict type corresponding to a key Literal passed to a function, so I could bind it to a TypeVar. That didn't work, but in trying to debug that I noticed that it's just straight up not possible to get a TypedDict to match a simple Protocol that we can see at type-checking time it does in fact match.
fromtypingimportLiteral, TypedDict, Protocol, OptionalclassFoo(TypedDict):
bar: intconcrete_var: Foo=Foo(bar=5)
# This typechecks (though it has to be optional for some reason even if the key# is Required in the TypedDict):int_var: Optional[int] =concrete_var.get("bar")
classGettable(Protocol):
defget(self, key: Literal["bar"]) ->Optional[int]: ...
# But we don't use that to know that the protocol matches. This fails:test_var: Gettable=concrete_var
Actual Behavior
main.py:16: error: Incompatible types in assignment (expression has type "Foo", variable has type "Gettable") [assignment]
main.py:16: note: Following member(s) of "Foo" have conflicts:
main.py:16: note: Expected:
main.py:16: note: def get(self, key: Literal['bar']) -> int | None
main.py:16: note: Got:
main.py:16: note: @overload
main.py:16: note: def get(self, str, /) -> object
main.py:16: note: @overload
main.py:16: note: def [_T] get(self, str, /, default: object) -> object
Found 1 error in 1 file (checked 1 source file)
MyPy appears to have forgotten everything it ever knew about the types of the things in the TypedDict when it tries to match the get() method to the protocol.
Your Environment
Mypy version used: 1.9.0
Python version used: 3.10 and 3.12
The text was updated successfully, but these errors were encountered:
Bug Report
I was trying to use a
Protocol
to fish out the value type from aTypedDict
type corresponding to a keyLiteral
passed to a function, so I could bind it to aTypeVar
. That didn't work, but in trying to debug that I noticed that it's just straight up not possible to get aTypedDict
to match a simpleProtocol
that we can see at type-checking time it does in fact match.To Reproduce
See https://mypy-play.net/?mypy=latest&python=3.12&gist=928611fe3fcf77630451b8ca6b26dfca
Actual Behavior
MyPy appears to have forgotten everything it ever knew about the types of the things in the
TypedDict
when it tries to match theget()
method to the protocol.Your Environment
The text was updated successfully, but these errors were encountered: