Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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のアップデートで修正してくださるでしょう。

参考サイト

simonritchie
4年間デザインの学校 → デザイナー → 2Dゲームのクライアントエンジニア → しがないデータエンジニア(いまここ)。勉強の側面が強いので、マイナーな記事も多く書きます。色々できるようになりたい。
https://qiita.com/simonritchie/private/992f04ef0c56914d25d2
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away