mypy
mypy copied to clipboard
Generator with await not considered an AsyncGenerator
Bug Report
- Generators containing the
await
keyword are considered Generator, rather than AsyncGenerator - Generator syntax does not permit
await
in a non-async function
To Reproduce
test.py:
import asyncio
from typing import AsyncGenerator
async def get_value(v: int) -> int:
await asyncio.sleep(1)
return v + 1
def get_generator() -> AsyncGenerator[int, None]:
return (await get_value(v) for v in [1, 2, 3])
async def test() -> None:
print(type(get_generator()))
async for x in get_generator():
print(x)
asyncio.get_event_loop().run_until_complete(test())
python:
> py test.py
<class 'async_generator'>
2
3
4
mypy:
mypy test.py
test.py:11: error: Incompatible return value type (got "Generator[int, None, None]", expected "AsyncGenerator[int, None]")
Expected Behavior
No errors should be reported.
Actual Behavior
test.py:11: error: Incompatible return value type (got "Generator[int, None, None]", expected "AsyncGenerator[int, None]")
test.py:11: error: 'await' outside coroutine ('async def')
Your Environment
- Mypy version used: 0.812
- Mypy command-line flags: None
- Mypy configuration options from
mypy.ini
(and other config files):
[mypy]
plugins = pydantic.mypy
strict_optional = True
warn_redundant_casts = True
warn_unused_ignores = True
disallow_any_generics = True
check_untyped_defs = True
disallow_untyped_defs = True
[pydantic-mypy]
init_forbid_extra = True
warn_required_dynamic_aliases = True
warn_untyped_fields = True
[mypy-bson.*]
ignore_missing_imports = True
[mypy-cachetools.*]
ignore_missing_imports = True
[mypy-asyncache.*]
ignore_missing_imports = True
[mypy-loguru]
ignore_missing_imports = True
[mypy-aiohttp_xmlrpc.*]
ignore_missing_imports = True
[mypy-asyncpg.*]
ignore_missing_imports = True
[mypy-bcrypt]
ignore_missing_imports = True
[mypy-passlib.*]
ignore_missing_imports = True
[mypy-slugify.*]
ignore_missing_imports = True
[mypy-barcode.*]
ignore_missing_imports = True
[mypy-qrcode.*]
ignore_missing_imports = True
[mypy-furl]
ignore_missing_imports = True
although
[mypy-defusedxml.*]
ignore_missing_imports = True
[mypy-pyticketswitch.*]
ignore_missing_imports = True
[mypy-pymongo.*]
ignore_missing_imports = True
[mypy-motor.*]
ignore_missing_imports = True
[mypy-stackprinter]
ignore_missing_imports = True
[mypy-PIL.*]
ignore_missing_imports = True
[mypy-aztec_code_generator.*]
ignore_missing_imports = True
[mypy-pdf417.*]
ignore_missing_imports = True
[mypy-pylibdmtx.*]
ignore_missing_imports = True
[mypy-toolz]
ignore_missing_imports = True
[mypy-stripe]
ignore_missing_imports = True
[mypy-google.*]
ignore_missing_imports = True
[mypy-coinoxr]
ignore_missing_imports = True
[mypy-sendgrid.*]
ignore_missing_imports = True
[mypy-opencensus.*]
ignore_missing_imports = True
- Python version used: 3.9.2, acquired via pyenv
- Operating system and version: Ubuntu 20.04.2
Seems you are missing async def
here def get_generator() -> AsyncGenerator[int, None]: