1# cython: language_level=3str, binding=True 2# mode: run 3# tag: pep492, await, gh3337 4 5""" 6Cython specific tests in addition to "test_coroutines_pep492.pyx" 7(which is copied from CPython). 8""" 9 10import sys 11 12 13def run_async(coro): 14 #assert coro.__class__ is types.GeneratorType 15 assert coro.__class__.__name__ in ('coroutine', '_GeneratorWrapper'), coro.__class__.__name__ 16 17 buffer = [] 18 result = None 19 while True: 20 try: 21 buffer.append(coro.send(None)) 22 except StopIteration as ex: 23 result = ex.value if sys.version_info >= (3, 5) else ex.args[0] if ex.args else None 24 break 25 return buffer, result 26 27 28async def test_async_temp_gh3337(x, y): 29 """ 30 >>> run_async(test_async_temp_gh3337(2, 3)) 31 ([], -1) 32 >>> run_async(test_async_temp_gh3337(3, 2)) 33 ([], 0) 34 """ 35 return min(x - y, 0) 36 37 38async def outer_with_nested(called): 39 """ 40 >>> called = [] 41 >>> _, inner = run_async(outer_with_nested(called)) 42 >>> called # after outer_with_nested() 43 ['outer', 'make inner', 'deco', 'return inner'] 44 >>> _ = run_async(inner()) 45 >>> called # after inner() 46 ['outer', 'make inner', 'deco', 'return inner', 'inner'] 47 """ 48 called.append('outer') 49 50 def deco(f): 51 called.append('deco') 52 return f 53 54 called.append('make inner') 55 56 @deco 57 async def inner(): 58 called.append('inner') 59 return 1 60 61 called.append('return inner') 62 return inner 63