-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Bug Report
Async callable which accepts a parameter with a union type, returns a union type and has @overload on said parameter has its return type erased when awaited. I'm hoping this sentence makes any sense, but in any case (pun not intended) the code snippet should demonstrate the issue.
To Reproduce
Here's the absolute minimum reproduction I could muster:
from typing import overload
class A: pass
class B: pass
@overload
async def foo(x: A) -> B: ...
@overload
async def foo(x: B) -> A: ...
async def foo(x: A | B) -> A | B:
return A() if isinstance(x, B) else B()
async def breaks(x: A | B) -> None:
y = await foo(x)
reveal_type(y) # Reveals Any, should reveal A | BThe following includes non async version of this code which actually works.
Gist URL: https://gist.github.com/2f8288673587ff27f6fca5024ddd0543
Playground URL: https://mypy-play.net/?mypy=master&python=3.11&gist=2f8288673587ff27f6fca5024ddd0543&flags=strict
Expected Behavior
await foo(x) in the above example should have type A | B.
Actual Behavior
note: Revealed type is "Any" is the actual result.
Your Environment
Original bug was found on Python 3.10 and mypy 0.991, with --strict and a number of per-file settings. I can include relevant excerpt of our pyproject.toml, although it seems that this issue is not configuration-specific.
On the playground the following was tried:
- Mypy version used: 0.991 (also tried with latest
masteras well as a random sampling of versions between0.670and0.990 - Mypy command-line flags: none and
--strict, in fact none of the flag combinations lead to correct result - Python version used: 3.10, 3.11