mypy icon indicating copy to clipboard operation
mypy copied to clipboard

Generator with await not considered an AsyncGenerator

Open audoh-tickitto opened this issue 3 years ago • 1 comments

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

audoh-tickitto avatar May 26 '21 14:05 audoh-tickitto

Seems you are missing async def here def get_generator() -> AsyncGenerator[int, None]:

joaoe avatar Jul 29 '22 12:07 joaoe