Python Type Annotations for a Generator


自從讀完 fluent python 後,用 type annotation 用得越來越順手,甚至有時候會在開發前期就下意識地盡可能把所有函數都標完。
但今天在寫到 generator function 的時候,突然想到一個問題,我要如何為一個 generator function 標記他的回傳型別呢?

查了下網路,typing 模組有提供 Generator 這個型別,但需要注意使用細節。
這個 Generator 是設計給通用的 generator function,對於通用的 generator function ,除了會做 yield 也會由外部 send 參數進來,最後這個 generator function 可能由 return 語句結束並附加上 StopIteration 的額外訊息。因此,需要分別對這三種情況做 type annotation,分別是 YieldTypeSendTypeReturnType

參考 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]







你可能感興趣的文章

Day 138

Day 138

用 JavaScript 學習資料結構和演算法:堆疊(Stack)篇

用 JavaScript 學習資料結構和演算法:堆疊(Stack)篇

 ASI 自動分號插入

ASI 自動分號插入






留言討論