Type Hint a generator

2023-03-30
#python

Python 中的 type hint (类型提示) 是指在声明变量的时候显式声明变量的数据类型的功能,在 Python3.5及后续版本中可用。类型提示是对 Python 这种弱类型语言的补充,可以在一定程度上提高代码的可读性和可维护性,使用方法很简单就是在变量后面使用 :类型 对变量的类型进行注解

  def greeting(name: str) -> str:
      return 'Hello ' + name

通过类型提示和一些工具可以在运行之前就可以将一些错误提前暴露出来。普通变量的类型提示都很简单,但是 Python 里有一个相对特殊的类型就是生成器

generator type hint

通常我们可以使用 Generator[YieldType, SendType, ReturnType] 去类型提示一个生成器

  def echo_round() -> Generator[int, float, str]:
      sent = yield 0
      while sent >= 0:
          sent = yield round(sent)
      return 'Done'

其中 SendType 则是预期调用 send() 函数的时传递的值类型,而 ReturnType 则是生成器结束时返回的值

  >>> gen = echo_round()
  >>> next(gen)
  0
  >>> gen.send(1.5)
  2
  >>> gen.send(2.5)
  2
  >>> try:
  ...     gen.send(-1)
  ... except StopIteration as e:
  ...     result = e.value
  ...
  >>> print(result)
  Done

但是有时候,我们用生成器只是生成值,SendTypeReturnType 基本都是 None

  def infinite_stream(start: int) -> Generator[int, None, None]:
      while True:
          yield start
          start += 1

这个时候使用 Generator[YieldType, SendType, ReturnType] 这种 type hint 似乎有点累赘,可以使用 Iterable[YieldType] 或者 Iterator[YieldType]:

  def infinite_stream(start: int) -> Iterator[int]:
      while True:
          yield start
          start += 1

参考资料

  1. PEP 484 – Type Hints | peps.python.org
  2. How to type hint a generator in Python 3? - Stack Overflow
  3. How to type hint a generator in python 3? - StackTuts
  4. 26.1. typing — Support for type hints — Python 3.6.15 documentation