Python

【Python】型ヒントで使用する型を指定しよう【アノテーション】

この記事では、Python で型ヒントを付ける方法を解説します。

型ヒントを付けることで そのオブジェクトがなんの型の値を使用するかわかるようになり、他の型の値を渡す危険性が少なくなります。

また、mypyモジュール を使うことで型ヒントに沿ったコードが書けているかどうかを確認することができます。

それでは、型ヒントの使い方を見ていきましょう!

型ヒントを書く

型ヒントとは、アノテーションを使って変数や引数に使用する型を記述することを言います。 Python 3.6で追加されました。

変数の型ヒント

変数には、以下のように型ヒントを書くことができます。

変数名: 型名
変数名: 型名 = 値

型ヒントを書く際に変数を初期化する必要はないが、初期化されていない変数を使うと NameError となる。

num: int
print(num)

実行結果

Traceback (most recent call last):
  File "main.py", line 2, in 
    print(num)
NameError: name 'num' is not defined

関数の型ヒント

関数には、以下のように型ヒントを書くことができる。

def 関数名(引数名: 型名) -> 戻り値の型名:
    # なんらかの処理

引数に int型 の値を2つ取り、戻り値に float型 の値を返す関数は以下のような感じ。

def func(a: int, b: int) -> float:
    return a / b

戻り値を返さない関数は、型ヒントに None を渡しておきます。

def func(a: int, b: int) -> None:
    print(a / b)

デフォルト値を指定する場合は、アノテーションを書いてからデフォルト値を書きます。

def func(a: int = 1, b: int = 2) -> None:
    print(a / b)

特殊な型を指定する

リストの要素の型を指定する場合や辞書の key, value の型を指定したい時なんかには typingモジュール を使います。

typingモジュール は、Python 3.5 で追加された標準モジュールです

リスト

要素の型を指定したリストの型ヒントを記述するには typing.List を使います。List では、複数の型を指定することはできません。

from typing import List

List[型名]

int型の要素を格納したリストは以下のような感じ。

from typing import List

values: List[int] = [1, 2, 3]

Python 3.9 からは list で同じことができるようになったので List は非推奨。

values: list[int] = [1, 2, 3]

タプル

要素の型を指定したタプルの型ヒントを記述するには typing.Tuple を使います。リストと異なり、格納する要素の数だけ型を記述します。

from typing import Tuple

Tuple[型名, 型名, ...]

int型 と str型 の要素を持ったタプルは以下のような感じ。

from typing import Tuple

values: Tuple[int, str] = (1, 'abc')

Python 3.9 からは tuple で同じことができるようになったので Tuple は非推奨。

values: tuple[int, str] = (1, 'abc')

辞書

key、value の型を指定した辞書の型ヒントを記述するには typing.Dict を使います。型をコロン(:)ではなくカンマ(,)で区切っているのに注意しましょう。

from typing import Dict

values: Dict[型名, 型名]

key に str型、value に int型 を格納する辞書を指定するには以下のような感じ。

from typing import Dict

values: Dict[str, int]

Python 3.9 からは dict で同じことができるようになったので Dict は非推奨。

values: dict[str, int]

ダックタイプ

シーケンスやイテラブルなど複数の型が所属する型を指定することもできます。

from typing import Iterable, Sequence

# イテラブル
values: Iterable[型名]

# シーケンス
values: Sequence[型名]

シーケンスの型ヒントを指定している変数をリストで初期化してみます。

from typing import Sequence

values: Sequence[int] = [1, 2, 3]

Python 3.9 からは collections.abc.Sequencecollections.abc.Iterable で同じことができるようになったので非推奨。

from collections.abc import Sequence, Iterable

values: Sequence[int]
values: Iterable[int]

さらに複雑な型ヒント

型ヒント中に型ヒントを記述することで さらに複雑な型ヒントを指定することができます。以下のコードでは、文字列を key, 整数を value に持った辞書を格納したリストの型ヒントを生成しています。

data = dict[str, int]
datas = list[data]

他にもいろんな書き方が用意されているので公式サイトを参考にしてください。

型ヒントに従ってコードが書けているか確認する

型ヒント通りにコードが書けているか確認するには mypyモジュール を使います。mypyは、標準ライブラリではないので pip でインストールしましょう❗️

pip install mypy

pipのインストール

それでは試しに mypy を使って型ヒント通りにコードが書けているか確認してみます。mypy を使用するには mypyコマンド を使います。

main.py

num: int = 'abc'
values: list[str] = [1, 2, 3]

コマンドラインで実行

$ mypy main.py
main.py:1: error: Incompatible types in assignment (expression has type "str", variable has type "int")
main.py:2: error: List item 0 has incompatible type "int"; expected "str"
main.py:2: error: List item 1 has incompatible type "int"; expected "str"
main.py:2: error: List item 2 has incompatible type "int"; expected "str"
Found 4 errors in 1 file (checked 1 source file)

型ヒント通りでない箇所は、エラーとして上記のように場所と内容が表示されます。

では、次はちゃんと型ヒントに沿ってコードを書いてみます。

num: int = 123
values: list[str] = ['a', 'b', 'c']

実行結果

$ mypy main.py 
Success: no issues found in 1 source file

Success と表示されれば型ヒント通りにコードが書けています。

まとめ

この記事では、型ヒントの書き方と確認方法を解説しました。

型ヒントを書くことでコードの安全性や可読性が増します。ちょこっとめんどくさいですが、毎回書くように心がけましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

『DMM WEBCAMP COMMIT』