mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-33041: Rework compiling an "async for" loop. (#6142)
* Added new opcode END_ASYNC_FOR. * Setting global StopAsyncIteration no longer breaks "async for" loops. * Jumping into an "async for" loop is now disabled. * Jumping out of an "async for" loop no longer corrupts the stack. * Simplify the compiler.
This commit is contained in:
parent
c65bf3fe4a
commit
702f8f3611
14 changed files with 276 additions and 226 deletions
|
@ -1846,6 +1846,36 @@ class CoroutineTest(unittest.TestCase):
|
|||
run_async(run_gen()),
|
||||
([], [121]))
|
||||
|
||||
def test_comp_4_2(self):
|
||||
async def f(it):
|
||||
for i in it:
|
||||
yield i
|
||||
|
||||
async def run_list():
|
||||
return [i + 10 async for i in f(range(5)) if 0 < i < 4]
|
||||
self.assertEqual(
|
||||
run_async(run_list()),
|
||||
([], [11, 12, 13]))
|
||||
|
||||
async def run_set():
|
||||
return {i + 10 async for i in f(range(5)) if 0 < i < 4}
|
||||
self.assertEqual(
|
||||
run_async(run_set()),
|
||||
([], {11, 12, 13}))
|
||||
|
||||
async def run_dict():
|
||||
return {i + 10: i + 100 async for i in f(range(5)) if 0 < i < 4}
|
||||
self.assertEqual(
|
||||
run_async(run_dict()),
|
||||
([], {11: 101, 12: 102, 13: 103}))
|
||||
|
||||
async def run_gen():
|
||||
gen = (i + 10 async for i in f(range(5)) if 0 < i < 4)
|
||||
return [g + 100 async for g in gen]
|
||||
self.assertEqual(
|
||||
run_async(run_gen()),
|
||||
([], [111, 112, 113]))
|
||||
|
||||
def test_comp_5(self):
|
||||
async def f(it):
|
||||
for i in it:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue