Python 3.x中Generator类型提示的SendType和ReturnType有何用途?
Generator[YieldType, SendType, ReturnType] 后两个类型参数的用途
生成器的能力不止于产出值,它还支持接收外部传入的值、返回最终结果,SendType和ReturnType就是用来标注这两种场景的类型:
- SendType:标注调用生成器
send(value)方法时传入参数的类型。生成器内部可以通过yield表达式接收这个值(格式为received = yield 产出值),received的类型就对应SendType。如果你的生成器不需要接收外部传入的值,这个类型可以设为None。
示例代码:
from typing import Generator def echo() -> Generator[str, str, None]: while True: msg = yield "请输入内容:" yield f"你输入了:{msg}" gen = echo() next(gen) # 启动生成器,获取初始产出值 print(gen.send("Hello World")) # 传入字符串类型,得到对应输出
- ReturnType:标注生成器函数执行到
return语句时返回值的类型。这个返回值不会通过常规迭代获取,需要捕获StopIteration异常,通过异常的value属性拿到。
示例代码:
from typing import Generator def countdown(n: int) -> Generator[int, None, str]: for i in range(n, 0, -1): yield i return f"倒计时结束,共{n}秒" gen = countdown(3) for num in gen: print(num) # 输出3、2、1 try: next(gen) except StopIteration as e: print(e.value) # 输出"倒计时结束,共3秒"
如果只需要标注生成器的产出类型,也可以用Iterable[YieldType]或Iterator[YieldType],但如果要精确描述生成器与外部的交互逻辑,就需要用到完整的Generator泛型定义。
内容的提问来源于stack exchange,提问作者yuvalm2
相关产品推荐
相关产品推荐

