如何为Python generator(生成器)指定正确的类型声明
你写的def f() -> Union[str,int]:是不正确的。
生成器函数执行后返回的是生成器对象,而非直接返回yield产出的值,因此不能直接把返回值标注为产出值的类型。
正确标注方法
Python提供了专用的Generator泛型类型用于标注生成器函数的返回值,它接收三个类型参数,格式为:Generator[YieldType, SendType, ReturnType]
三个参数的含义分别是:
- 第一个参数:生成器通过yield产出的值的类型,就是你需要的
Union[str, int] - 第二个参数:调用生成器
send()方法可以传入的值的类型,如果你不会主动调用send方法传值,填None即可 - 第三个参数:生成器迭代结束后显式return返回的值的类型,没有显式return的话填
None即可
代码示例
Python 3.9及以上版本可以直接从collections.abc导入Generator,3.10+还支持用|简化Union写法:
from collections.abc import Generator def f() -> Generator[str | int, None, None]: yield "Banana" yield 68
如果使用3.9以下的Python版本,需要从typing模块导入对应类型:
from typing import Generator, Union def f() -> Generator[Union[str, int], None, None]: yield "Banana" yield 68
简化写法
如果你仅会遍历这个生成器,不会用到send、throw等生成器专属方法,也可以直接标注为Iterable[Union[str, int]],语义同样成立:
from collections.abc import Iterable from typing import Union def f() -> Iterable[Union[str, int]]: yield "Banana" yield 68
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

