Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@overload on async callables accepting and returning union types leads to type erasure #14223

Closed
mishok13 opened this issue Nov 29, 2022 · 1 comment · Fixed by #14224
Closed
Labels
bug mypy got something wrong topic-async async, await, asyncio topic-overloads

Comments

@mishok13
Copy link

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 | B

The 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 master as well as a random sampling of versions between 0.670 and 0.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
@mishok13 mishok13 added the bug mypy got something wrong label Nov 29, 2022
hauntsaninja added a commit to hauntsaninja/mypy that referenced this issue Nov 30, 2022
@hauntsaninja
Copy link
Collaborator

Thanks for the report! Things should not silently become Any :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug mypy got something wrong topic-async async, await, asyncio topic-overloads
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants