自從讀完 fluent python 後,用 type annotation 用得越來越順手,甚至有時候會在開發前期就下意識地盡可能把所有函數都標完。
但今天在寫到 generator function 的時候,突然想到一個問題,我要如何為一個 generator function 標記他的回傳型別呢?
查了下網路,typing 模組有提供 Generator 這個型別,但需要注意使用細節。
這個 Generator 是設計給通用的 generator function,對於通用的 generator function ,除了會做 yield
也會由外部 send
參數進來,最後這個 generator function 可能由 return
語句結束並附加上 StopIteration
的額外訊息。因此,需要分別對這三種情況做 type annotation,分別是 YieldType
,SendType
和 ReturnType
。
參考 Python 官方文件的範例變一目瞭然。yield
出去的型別是 int
,可接收的值是 float
,最後 return
的變數型別為 str
def echo_round() -> Generator[int, float, str]:
sent = yield 0
while sent >= 0:
sent = yield round(sent)
return 'Done'
那如果我的 generator function 只有做 yield 的話,可以註記為 Generator[int, None, None]
。
但這樣的寫法過度冗長,官方建議如果只有 yield
可以改用 Iterator[YieldType]
或 Iterable[YieldType]
。