Closed
Description
Trying to get typing work in an asynchronous code and I don't understand mypy's behavior.
Let's say we have two coroutines typed in the following way:
from typing import AsyncGenerator
async def gen1() -> AsyncGenerator[str, None]:
pass
reveal_type(gen1)
async def gen2() -> AsyncGenerator[str, None]:
yield 'tick'
reveal_type(gen2)
mypy:
$ mypy file.py
file.py:5: error: Revealed type is 'def () -> typing.Awaitable[typing.AsyncGenerator[builtins.str, builtins.None]]'
file.py:9: error: Revealed type is 'def () -> typing.AsyncGenerator[builtins.str, builtins.None]'
So the type of the first one gets wrapped in Awaitable
. I don't fully understand why. I thought all Async...
are Awaitables by definition. I did not find anything about it but here #3576, which is not enough for me to get it.
The same thing in case of methods:
class BaseClass:
async def gen1(self) -> AsyncGenerator[str, None]:
pass
reveal_type(BaseClass.gen1)
class MyClass(BaseClass):
async def gen1(self) -> AsyncGenerator[str, None]:
yield 'tick'
reveal_type(MyClass.gen1)
mypy:
file.py:4: error: Revealed type is 'def (self: acm.workers.BaseClass) -> typing.Awaitable[typing.AsyncGenerator[builtins.str, builtins.None]]'
file.py:7: error: Return type of "gen1" incompatible with supertype "BaseClass"
file.py:9: error: Revealed type is 'def (self: acm.workers.MyClass) -> typing.AsyncGenerator[builtins.str, builtins.None]'
So now I cannot define abstract methods that are async generators, in a straightforward way.
Versions
Python 3.6.5
mypy==0.600
EDIT: I fixed a random typo @JelleZijlstra found and edited parts of the text based on the typo. Now the whole problem is clearer.