@@ -303,25 +303,125 @@ def f() -> Generator[int, str, int]:
303
303
[builtins fixtures/async_await.pyi]
304
304
[out]
305
305
306
+ -- Async generators (PEP 525), some test cases adapted from the PEP text
307
+ -- ---------------------------------------------------------------------
308
+
306
309
[case testAsyncGenerator]
307
310
# flags: --fast-parser --python-version 3.6
308
311
from mypy_extensions import AsyncGenerator
309
312
310
313
async def f() -> int:
311
314
return 42
312
315
313
- async def g() -> AsyncGenerator[int, str ]:
316
+ async def g() -> AsyncGenerator[int, None ]:
314
317
value = await f()
315
- reveal_type(value) # E: Revealed type is 'builtins.int'
316
- x = yield value
317
- reveal_type(x) # E: Revealed type is 'builtins.str'
318
+ reveal_type(value) # E: Revealed type is 'builtins.int*'
319
+ yield value
320
+ # return without a value is fine
321
+ return
322
+ reveal_type(g) # E: Revealed type is 'def () -> typing.AsyncGenerator[builtins.int, void]'
323
+ reveal_type(g()) # E: Revealed type is 'typing.AsyncGenerator[builtins.int, void]'
318
324
319
325
async def h() -> None:
320
326
async for item in g():
321
- reveal_type(item) # E: Revealed type is 'builtins.int'
327
+ reveal_type(item) # E: Revealed type is 'builtins.int*'
328
+
329
+ [builtins fixtures/dict.pyi]
330
+
331
+ [case testAsyncGeneratorManualIter]
332
+ # flags: --fast-parser --python-version 3.6
333
+ from mypy_extensions import AsyncGenerator
334
+
335
+ async def genfunc() -> AsyncGenerator[int, None]:
336
+ yield 1
337
+ yield 2
338
+
339
+ async def user() -> None:
340
+ gen = genfunc()
341
+
342
+ reveal_type(gen.__aiter__()) # E: Revealed type is 'typing.AsyncGenerator[builtins.int*, void]'
343
+
344
+ reveal_type(await gen.__anext__()) # E: Revealed type is 'builtins.int*'
345
+
346
+ [builtins fixtures/dict.pyi]
347
+
348
+ [case testAsyncGeneratorAsend]
349
+ # flags: --fast-parser --python-version 3.6
350
+ from mypy_extensions import AsyncGenerator
351
+
352
+ async def f() -> None:
353
+ pass
354
+
355
+ async def gen() -> AsyncGenerator[int, str]:
356
+ await f()
357
+ v = yield 42
358
+ reveal_type(v) # E: Revealed type is 'builtins.str'
359
+ await f()
360
+
361
+ async def h() -> None:
362
+ g = gen()
363
+ await g.asend(()) # E: Argument 1 to "asend" of "AsyncGenerator" has incompatible type "Tuple[]"; expected "str"
364
+ reveal_type(await g.asend('hello')) # E: Revealed type is 'builtins.int*'
322
365
323
366
[builtins fixtures/dict.pyi]
324
367
368
+ [case testAsyncGeneratorAthrow]
369
+ # flags: --fast-parser --python-version 3.6
370
+ from mypy_extensions import AsyncGenerator
371
+
372
+ async def gen() -> AsyncGenerator[str, int]:
373
+ try:
374
+ yield 'hello'
375
+ except BaseException:
376
+ yield 'world'
377
+
378
+ async def h() -> None:
379
+ g = gen()
380
+ v = await g.asend(1)
381
+ reveal_type(v) # E: Revealed type is 'builtins.str*'
382
+ await g.athrow(BaseException)
383
+
384
+ [builtins fixtures/dict.pyi]
385
+
386
+ [case testAsyncGeneratorNoSyncIteration]
387
+ # flags: --fast-parser --python-version 3.6
388
+ from mypy_extensions import AsyncGenerator
389
+
390
+ async def gen() -> AsyncGenerator[int, None]:
391
+ for i in (1, 2, 3):
392
+ yield i
393
+
394
+ def h() -> None:
395
+ for i in gen():
396
+ pass
397
+
398
+ [builtins fixtures/dict.pyi]
399
+
400
+ [out]
401
+ main:9: error: Iterable expected
402
+ main:9: error: AsyncGenerator[int, None] has no attribute "__iter__"; maybe "__aiter__"?
403
+
404
+ [case testAsyncGeneratorNoYieldFrom]
405
+ # flags: --fast-parser --python-version 3.6
406
+ from mypy_extensions import AsyncGenerator
407
+
408
+ async def f() -> AsyncGenerator[int, None]:
409
+ pass
410
+
411
+ async def gen() -> AsyncGenerator[int, None]:
412
+ yield from f() # E: 'yield from' in async function
413
+
414
+ [builtins fixtures/dict.pyi]
415
+
416
+ [case testAsyncGeneratorNoReturnWithValue]
417
+ # flags: --fast-parser --python-version 3.6
418
+ from mypy_extensions import AsyncGenerator
419
+
420
+ async def gen() -> AsyncGenerator[int, None]:
421
+ yield 1
422
+ return 42
423
+
424
+ [builtins fixtures/dict.pyi]
325
425
326
426
-- The full matrix of coroutine compatibility
327
427
-- ------------------------------------------
0 commit comments