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]

バージョン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')

バージョン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]

バージョン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]

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

from collections.abc import Sequence, Iterable

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

さらに複雑な型ヒント

型ヒント中に型ヒントを指定することでさらに複雑な型ヒントを指定することができます。

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

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

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

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

pip install mypy

Linkpipのインストール

それでは試しに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)

まとめ

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

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

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

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』