1
# cython: language_level=3, binding=True
3
# tag: pep492, asyncfor, await
6
def run_async(coro, ignore_type=False):
8
#assert coro.__class__ is types.GeneratorType
9
assert coro.__class__.__name__ in ('coroutine', 'GeneratorWrapper'), coro.__class__.__name__
15
buffer.append(coro.send(None))
16
except StopIteration as ex:
17
result = ex.args[0] if ex.args else None
22
def run_async__await__(coro):
23
assert coro.__class__.__name__ in ('coroutine', 'GeneratorWrapper'), coro.__class__.__name__
31
buffer.append(next(aw))
33
buffer.append(aw.send(None))
35
except StopIteration as ex:
36
result = ex.args[0] if ex.args else None
41
async def await_pyobject(awaitable):
43
>>> async def simple():
46
>>> buffer, result = run_async(await_pyobject(simple()))
50
>>> async def awaiting(awaitable):
51
... return await awaitable
53
>>> buffer, result = run_async(await_pyobject(awaiting(simple())))
57
return await awaitable
62
>>> async def run_await(awaitable):
63
... return await awaitable
65
>>> simple, awaiting = await_cyobject()
67
>>> buffer, result = run_async(run_await(simple()))
71
>>> buffer, result = run_async(run_await(awaiting(simple())))
75
>>> buffer, result = run_async(run_await(awaiting(awaiting(simple()))))
79
>>> buffer, result = run_async(run_await(awaiting(run_await(awaiting(simple())))))
87
async def awaiting(awaitable):
88
return await awaitable
90
return simple, awaiting
95
def yield_from_cyobject():
97
>>> async def py_simple_nonit():
100
>>> async def run_await(awaitable):
101
... return await awaitable
103
>>> def run_yield_from(it):
104
... return (yield from it)
106
>>> simple_nonit, simple_it, awaiting, yield_from = yield_from_cyobject()
108
>>> buffer, result = run_async(run_await(simple_it()))
111
>>> buffer, result = run_async(run_await(awaiting(simple_it())))
114
>>> buffer, result = run_async(awaiting(run_await(simple_it())), ignore_type=True)
117
>>> buffer, result = run_async(run_await(py_simple_nonit()))
121
>>> buffer, result = run_async(run_yield_from(awaiting(run_await(simple_it()))), ignore_type=True)
125
>>> buffer, result = run_async(run_yield_from(simple_it()), ignore_type=True)
128
>>> buffer, result = run_async(yield_from(simple_it()), ignore_type=True)
132
>>> next(run_yield_from(simple_nonit())) # doctest: +ELLIPSIS
133
Traceback (most recent call last):
135
>>> next(run_yield_from(py_simple_nonit())) # doctest: +ELLIPSIS
136
Traceback (most recent call last):
138
>>> next(yield_from(py_simple_nonit()))
139
Traceback (most recent call last):
140
TypeError: 'coroutine' object is not iterable
142
async def simple_nonit():
145
@cython.iterable_coroutine
146
async def simple_it():
149
@cython.iterable_coroutine
150
async def awaiting(awaitable):
151
return await awaitable
154
return (yield from it)
156
return simple_nonit, simple_it, awaiting, yield_from