Reputation: 3442
Consider a coroutine which calls into another coroutine:
async def foo(bar):
result = await bar()
return result
This works fine if bar
is a coroutine.
What do I need to do (i.e. with what do I need to wrap the call to bar
) so that this code does the right thing if bar
is a normal function?
It is perfectly possible to define a coroutine with async def
even if it never does anything asynchronous (i.e. never uses await
).
However, the question asks how to wrap/modify/call a regular function bar
inside the code for foo
such that bar
can be awaited.
Upvotes: 28
Views: 22468
Reputation: 13415
Simply wrap your synchronous function with asyncio.coroutine if needed:
if not asyncio.iscoroutinefunction(bar):
bar = asyncio.coroutine(bar)
Since it is safe to re-wrap a coroutine, the coroutine function test is actually not required:
async_bar = asyncio.coroutine(sync_or_async_bar)
Therefore, your code can be re-written as follows:
async def foo(bar):
return await asyncio.coroutine(bar)()
Upvotes: 26