Unexpected behavior regarding async generator
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.