Python Async/Await のいまいちさ

Python の async/await について調べもの。

主な興味として generator を async / await ベースで書けるか知りたい。本文に yield のある関数が自動的に generator になる辛い仕様のない世界は(書き手が気をつければ)実現できるのか。

PEP 492 -- Coroutines with async and await syntaxPEP 525 -- Asynchronous Generators を眺めた結論としては、できなそう。むしろ "async generator" というものが登場してより複雑になった感がある。PEP 492 は冒頭で自分の不満を async/await の動機のひとつとして上げているにもかかわらずそれを解決していない。ひどくね?

翻って Kotlin を見るに, async/await と yield はどちらも suspending function である、というかどちらも coroutine 言語機能の上に書かれたライブラリ関数である。型チェックの助けもあり、Python にあった複雑さは存在しない。Python ももうちょっとレイヤリングをがんばって async/await を generator の延長に実装し、その上で yield の紛らわしさを解消する構文を足してほしかった・・・

以前 Flask の一味 Armin Ronacher が Python の coroutine わからんという記事を書いていた。彼の不満はランタイム API の話が中心だったけど、その複雑さは文法にも染み出している。つらい。

Python の async/await が自分に必要となる場面はそれほど想像できないので、なかったものとしておくのが良いかもしれない。