生成器类型注解:send参数类型应设为Any还是None?
不使用send()的生成器,send_value类型注解该选Any还是None?
import typing as t def pi_generator() -> t.Generator[int, ???, None]: pi = "3141592" for digit in pi: yield int(digit) pi_gen = pi_generator() next(pi_gen) # 3 pi_gen.send('foo') # 1 pi_gen.send(pi_gen) # 4
支持设为Any的理由
- 该生成器可以正常接收任意类型的
send()参数,调用者如果有需求执行.send(1)这类操作完全可行。 - 方法参数类型具备通用性,
.send(x: Any)比.send(x: None)的适用范围更广。
支持设为None的理由
- 返回类型注解应尽可能精准,“从不使用send的生成器”比“任意类型生成器”的语义更明确。
- 如果有人对该生成器调用
send(),大概率是误解了它的功能,类型注解可以起到提示、避免误用的作用。
两种写法都符合Python类型注解规范,具体选择取决于你的设计意图:
- 若希望保留最大灵活性,允许调用者随意使用
send(),选Any; - 若想明确告知调用者该生成器无需接收
send()参数,避免误用,选None。
内容的提问来源于stack exchange,提问作者Kaia
相关产品推荐
相关产品推荐

