如何在Python中将普通值转换为可等待(awaitable)对象?
将普通值转为可等待对象的实现方案
针对你需要把int这类普通值转为可等待对象的需求,以下几种方案都能满足要求,无需在调用端添加额外判断逻辑:
1. 自定义异步恒等函数(你的初始方案)
你自己实现的这个方法完全可行,代码简洁直观,是最推荐的方案之一:
async def make_awaitable(value): return value
这个函数本身是协程对象,被await时直接返回传入的value,完美适配你的异步生成器场景。
2. 返回已完成的Future对象
利用标准库asyncio的Future类,直接创建一个已完成的Future对象,同样可被await:
import asyncio def make_awaitable(value): fut = asyncio.Future() fut.set_result(value) return fut
这种方式不需要定义异步函数,直接返回可等待对象,性能上略优(减少一次协程调度步骤)。
3. 用asyncio.coroutine包装同步函数
可以用asyncio.coroutine装饰器把同步的恒等函数转为协程,但相比前两种方案可读性稍差,一般不推荐:
import asyncio make_awaitable = asyncio.coroutine(lambda x: x)
适配你的异步生成器场景示例
以第一种方案为例,异步生成器可以这样写:
async def async_gen(): # 先获取第一个已等待完成的int值 first_val = await fetch_first_value() # 转为可等待对象返回 yield make_awaitable(first_val) # 后续直接生成可等待对象 yield fetch_next_value() yield fetch_another_value()
调用端可以统一用await item处理所有生成的对象,无需区分是否为原始可等待对象。
内容的提问来源于stack exchange,提问作者hl037_
相关产品推荐
相关产品推荐

