我们如何调用需要协程的普通函数?

How do we call a normal function where a coroutine is expected?

考虑调用另一个协程的协程:

async def foo(bar):
     result = await bar()
     return result

如果 bar 是一个协程,这会很好地工作。 我需要做什么(即,我需要用什么来包装对 bar 的调用),以便如果 bar 是一个普通函数,这段代码可以做正确的事情?

完全可以用 async def 定义协程,即使它从不执行任何异步操作(即从不使用 await)。 但是,问题询问如何在 foo 的代码中 wrap/modify/call 一个常规函数 bar 以便可以等待 bar

如果需要,只需用 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)()