型ヒントしたい(typing

1# 変数名: 型ヒント = 値
2year: int = 2023
3pi: float = 3.14
4holiday: tuple[int, int, int, str] = (2023, 5, 5, "こどもの日")

typingで、関数の引数などに型ヒント(=型情報)を追加できます。 Python3.5で追加された標準モジュールです。 型ヒントがあると、VS CodeなどのIDEで編集中に型チェックしてくれるようになります。 入力時に補完候補を表示してくれたり、値がマッチしていない部分をハイライトしてくれたりします。

注釈

最近(2020年)は、TypeScriptやRustに代表される静的型付けな言語がトレンドです。 その波がPythonにもやってきて、関数アノテーションを利用した型ヒントが導入されました。

C/C++初心者のころ、型を宣言するのめんどくさいなと思っていたところでPythonに触れ、 型とか気にしなくても書けるの超便利じゃん!と感動したことがあったので、1周回ってきた感があります。

注釈

デフォルトの型ヒントには強制力はありません。 より厳しく型ヒント/型チェックしたい場合はPydanticなどのパッケージを利用してください。

ビルトインの型を使いたい

1# リスト型
2x: list[int] = [1]
3x: set[int] = {6, 7}
4
5# 辞書型
6x: dict[str, float] = {"field": 2.0}

Python3.9以降であれば、ビルトインされている型で型ヒントできます。

内容

int

整数値

float

浮動小数点

bool

真偽値

str

文字列

bytes

8ビット文字列

object

任意のオブジェクト

list[str]

(文字列の)リスト

tuple[int, int]

2要素のタプル

tuple[int, ...]

任意の要素数のタプル

dict[str, int]

{文字列: 整数値}の辞書

追加の型を使いたい

1from typing import Any, Iterable, Sequence, Mapping

typingモジュールが提供している型もあります。

内容

Any

なんでも

Iterable[int]

整数値のlist-likeな集まり

Sequence[int]

読み込み専用のlist-likeな集まり

Mapping[str, int]

dict-likeな集まり

mypyのチートシートがとても参考になります。

複数の型ヒントしたい

1# Python3.9まで
2from typing import Union
3x: Union[int, str]
4
5# Python3.10以降
6x: int | str
7x: list[int|str] = [3, 5, "test"]

typing.Unionを使って、複数の型ヒントを組み合わせて指定できます。 Python3.10以降ではOR記号( | ) を使ってより簡単に表現できるようになりました。

Noneしたい

1# Python3.9まで
2typing import Optional
3x: Optional[str]
4
5# Python3.10以降
6x: str | None

Noneを含む場合はtyping.Optionalを使います。 Python3.10以降ではOR記号( | ) を使って直感的に表現できるようになりました。

Duck Typeしたい

1# 関数の list-like な引数
2from typing import Iterable
3def f(ints: Iterable[int]) -> list[str]:
4    return [str(x) for x in ints]
1# 関数の dict-like な引数
2from typing import Mapping
3def f(mapping: Mapping[int, str]) -> list[int]:
4    mapping[5] = "maybe"
5    return list(mapping.keys())
6
7def f(mapping: MutableMapping[int, str]) -> set[str]:
8    mapping[5] = "maybe"
9    return set(mapping.values())

リファレンス