かもブログ

かもかも(@kam0_2)の雑記。掃き溜め。備忘録。

【VSCode+Pylance】 Pythonの関数の型NoneとNoReturnの使い分け(備忘録)

VSCodePythonを書くとき,Pylance拡張機能を使うととても便利ですが,少し気になったことに遭遇しました.以下の画像を見てください.f:id:two_headed_duck:20210716221549p:plain
f:id:two_headed_duck:20210716221622p:plain
明らかに最後のprintは実行されるコードですが,Pylanceはこのコードを「未到達のコード」と判断しています.

NoReturnとNone

Python 3.5からはプログラマの理解のために型アノテーションを記述できるようになりました.変数や引数のみならず,関数の戻り値の型も指定できます. その際に,返値を返さない関数については,"None"か"NoReturn"を記述します.この使い分けを理解していなかったので上のような現象に悩むことになったようです.

www.python.org

PEP 0484を軽く見てみると,両者の使い分けがわかります.
通常の「返り値のない関数」に使うべきなのはNoneです.それもそのはず,Pythonではreturnせずに終了したり,returnで何も返さないとNoneが返ります. 対して,NoReturnは本当に何も返らない場合に使います.例外のraiseやexit()です.
 Pylanceはこのルールを厳格に運用しており,このような挙動になるようです.しかし,Pylanceのissueにも「おかしくね👈仕様だよ」のレスがありますし,ちょっとわかりづらいですよね.