考虑一个调用另一个协程的协程:
async def foo(bar):
result = await bar()
return result
如果bar
是协程,这可以正常工作。
我需要做什么(即我需要将调用包装到bar
),以便在bar
是正常函数时,此代码能做正确的事情?
完全可以定义一个带有async def
的协程,即使它从不执行任何异步操作(即从不使用await
)。
但是,问题是如何在bar
的代码中包装/修改/调用常规函数foo
,以便等待bar
。
答案 0 :(得分:8)
如果需要,只需用asyncio.coroutine包装同步函数:
if not asyncio.iscoroutinefunction(bar):
bar = asyncio.coroutine(bar)
由于重新包装协程是安全的,因此实际上不需要协程功能测试:
async_bar = asyncio.coroutine(sync_or_async_bar)
因此,您的代码可以重写如下:
async def foo(bar):
return await asyncio.coroutine(bar)()