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
fromtypingimportCallable, ParamSpec, Protocol, TypeVarParams=ParamSpec("Params")
Result=TypeVar("Result", covariant=True)
classFancyMethod(Protocol):
def__call__(self, arg1: int, arg2: str) ->list[float]:
""" Calling me results in a very specific signature. """defreturnMe(self: Callable[Params, Result]) ->Callable[Params, Result]:
...
defexternalGet(self: Callable[Params, Result]) ->Callable[Params, Result]:
returnself
Expected Behavior
I would expect that this would be inferred in returnMe the same way that it would be in externalGet.
Actual Behavior
main.py:13: error: The erased type of self "def (*Params.args, **Params.kwargs) -> Result`-2" is not a supertype of its class "__main__.FancyMethod" [misc]
The text was updated successfully, but these errors were encountered:
Fixes#15734Fixes#15188Fixes#14321Fixes#13107 (plain Callable was
already working, this fixes the protocol example)
Fixes#16058
It looks like treating trivial suffixes (especially for erased
callables) as "whatever works" is a right thing, because it reflects the
whole idea of why we normally check subtyping with respect to an e.g.
erased type. As you can see this fixes a bunch of issues. Note it was
necessary to make couple more tweaks to make everything work smoothly:
* Adjust self-type erasure level in `checker.py` to match other places.
* Explicitly allow `Callable` as a `self`/`cls` annotation (actually I
am not sure we need to keep this check at all, since we now have good
inference for self-types, and we check they are safe either at
definition site or at call site).
Bug Report
Methods on protocols with a
__call__
method cannot infer the type ofself
as callable in other methods.
To Reproduce
https://mypy-play.net/?mypy=latest&python=3.11&flags=strict&gist=7234281168a0762dd9a81b1f10d8a96a
Expected Behavior
I would expect that this would be inferred in
returnMe
the same way that it would be inexternalGet
.Actual Behavior
The text was updated successfully, but these errors were encountered: