Python3.10.0のα版が公開されていました。
Python 3.10.0a2 is now available for testing. The engines of the secret release manager machine have finished producing a new pre-release. Get it here: https://t.co/CmrqKoR4we. This is an early developer preview of Python 3.10.
— Python Software Foundation (@ThePSF) November 7, 2020
リリースノートを見ていて、| 記号によるUnionとしての型アノテーションの書き方(PEP604)が追加になっていたのでPython3.10.0をインストールしつつ詳しく調べてみました。
typingのUnionやOptionalクラスのimportなどが不要になる
今まで複数の型になりうる値に関しては以下のようにUnionクラスをimportして使う必要がありました。
from typing import Union
value: Union[int, str] = 10
また、変数や引数などでNoneもしくは他の型の値を取るといったケースではOptionalを同様にimportして使う必要がありました。
from typing import Optional
value: Optional[int] = None
それが今後、以下のように|
の記号を使うことで型アノテーションができるようになります。
value: int|str = 100
importが不要になり楽になりますし、1行の文字数が多くなったりしないのでPEP8などの準拠が楽になります。
少し前に追加された、typingモジュールを使ったList[型]
の代わりにlist[型]
といったように書けるようになったのと同様に、型アノテーションがより楽になる正常進化的な感じでしょうか。
Optionalに関しても同様に|
記号とNoneを使うことで、import無しで型アノテーションできるようになります。
value: int|None = None
他と組み合わせるとぐぐっと記述がシンプルになる
たとえばキーに文字列、値にintもしくはfloatを受け付ける辞書に対して型アノテーションをしたいとします。旧来(Python3.8以前など)では以下のように書く必要がありました。
from typing import Dict, Union
value: Dict[str, Union[int, float]] = {'price': 100}
それがPython3.10環境では以下のように書けるようになります(dictやlistで書けるようになったのは3.9からとなります)。
importが減る点も含め、行数も列数も(入れ子になったりせず)結構すっきりします。
value: dict[str, int|float] = {'price': 100}
もちろん引数や返却値などでも使える
前述のものは関数の引数や返却値でも同様に利用できます。
特に型アノテーションでの指定がリストや辞書などで入れ子になったりすると、複数の引数や返却値を持つ関数などで横に長くなったり見づらくなったりしがちだったものがシンプルな記述になります。
def sample_func(
value_1: int|str, value_2: dict[str, int|float],
value_3: int|None=None) -> int|None:
...
isinstanceやissubclassでも使えるようになる
型チェックで使われるisinstanceやissubclassに関して、複数の型を対象とする場合には以下のようにタプルを使う必要がありました。
>>> value = 100
>>> print(isinstance(value, (int, str)))
True
今後はタプルの代わりに以下のように|
記号を使って書くこともできるようになります。
>>> value = 'apple'
>>> print(isinstance(value, str|int))
True
Pylanceでの対応状況は・・・
今回の記事の内容はVS Code + Pylance + Kiteの環境を使っています。
(Pylanceについての記事 : [Python]PylanceのVS Code拡張機能をさっそく使ってみた。)
マウスオーバー時などの型の表示はすでにちゃんと対応が入っていました。
補完なども問題なく、複数の型に応じたものなどが表示されていました。
ただし、|
記号の箇所ではPylanceでエラーと判定されていました。
VS Code上でPython3.10.0のインタプリタを設定していてもこのエラーが出ます。まあこれは近いうちにPylanceのアップデートで修正してくださるでしょう。