21
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonその2Advent Calendar 2020

Day 1

Python3.10で採択された | 記号によるUnionの型アノテーションについて早速調べてみた(PEP604)

Last updated at Posted at 2020-11-30

Python3.10.0のα版が公開されていました。

リリースノートを見ていて、| 記号による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拡張機能をさっそく使ってみた。

マウスオーバー時などの型の表示はすでにちゃんと対応が入っていました。

image.png

補完なども問題なく、複数の型に応じたものなどが表示されていました。

image.png

ただし、|記号の箇所ではPylanceでエラーと判定されていました。

image.png

VS Code上でPython3.10.0のインタプリタを設定していてもこのエラーが出ます。まあこれは近いうちにPylanceのアップデートで修正してくださるでしょう。

参考サイト

21
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?