KEMBAR78
Generator with await not considered an AsyncGenerator · Issue #10534 · python/mypy · GitHub
Skip to content

Generator with await not considered an AsyncGenerator #10534

@audoh-tickitto

Description

@audoh-tickitto

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-asyncasync, await, asyncio

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions