我正在尝试为生成器函数编写
:rtype:
类型提示。它返回的类型是什么?
例如,假设我有这个产生字符串的函数:
def read_text_file(fn):
"""
Yields the lines of the text file one by one.
:param fn: Path of text file to read.
:type fn: str
:rtype: ???????????????? <======================= what goes here?
"""
with open(fn, 'rt') as text_file:
for line in text_file:
yield line
返回类型不仅仅是一个字符串,它是某种可迭代的字符串?所以我不能只写
:rtype: str
。什么是正确的提示?
Generator[str, None, None]
或Iterator[str]
python 3.9之前:
from typing import Generator
python 3.9 以上版本:
from collections.abc import Generator
从 Python 3.9 开始,您可以使用来自
Generator[YieldType, SendType, ReturnType]
的
collections.abc
泛型来注释生成器。例如:
from collections.abc import Generator
def echo_round() -> Generator[int, float, str]:
sent = yield 0
while sent >= 0:
sent = yield round(sent)
return 'Done'
在早期版本的 Python 中,您可以从 Generator
模块导入
typing
类。或者,可以使用 Iterable[YieldType]
中的 Iterator[YieldType]
或 typing
。
比较
Iterator
与Generator
...
文档将
collections.abc.Generator
定义为“ABC for generator classes that implement ... the send()
, throw()
and close()
methods”.
所以我将
collections.abc.Iterator[ReturnType]
用于“普通”生成器,并保留 collections.abc.Generator
用于我已实施 send()
/throw()
/close()
的情况。