➡️

【型アノテーション】Pythonの矢印は何者か

2024/03/03に公開

この記事は何

Pythonのコードを読んでいたら急に矢印(->)が現れてびっくりした人向けの記事です。
備忘録でもあります。

TL;DR

Pythonでの -> 表記は型アノテーションを表しています。
変数や関数の引数や戻り値の型のヒントを定義できます。

型を定義するのではなくあくまで型のヒントを記述しているだけ、というところがポイントです。
これに違反していても実行時にエラーにならないことに注意してください。

実際に触ってみる

2つの値を足すだけの簡単な関数を定義してみましょう。

def Addition(x, y):
    return x + y

これらを呼び出す際は、Addition関数に2つのint型を渡してあげればうまく動きます。

result = Addition(2, 3)
print(result) # 5

実装した自分自身であれば、Addition関数にはint型を渡さなくてはいけないこともわかります。
ただ、ソースコードが大きくなり複雑になった場合や、他の人が誤って使ってしまったらどうなるでしょうか?

invalid_result = Addtion(2,3)
print(invalid_result) # 23

Addition関数にはint型以外も入れることができてしまい、意図しない結果になってしまっています。
これらはコンパイルエラーとならないため、バグに繋がってしまう可能性があります。

関数や変数の型制約を示すことができたら上記のようなバグは減る[1]と思いませんか?
そこで -> (型アノテーション)の登場です。

def Addition(x:int,y:int)->int:
    return x+y

上記のように書くことで、Additionの使い方に関して2点わかります。
・引数x,yは2つともint型である
・返り値もint型である

しかし、このままではpythonファイルは実行できてしまいます。
どのように型エラーを検知するのでしょうか。

型定義エラーを検知する方法

Visual studio

拡張機能のPylanceを使います。
Pylanceをインストール

インストール後、設定からPython › Analysis: Type Checking Mode をbasic以上に設定してください。
Pylance設定

VSCode再起動後、pythonファイルを確認すると適応されています。
Pylance設定

mypy

Pythonの型チェックを行ってくれるツールがあります。
https://github.com/python/mypy

インストール

$ pip3 install mypy
$ mypy --version     
mypy 1.8.0 (compiled: yes)

実行

$ mypy sample/annotations-test.py 
sample/annotations-test.py:9: error: Argument 1 to "Addition" has incompatible type "str"; expected "int"  [arg-type]
sample/annotations-test.py:9: error: Argument 2 to "Addition" has incompatible type "str"; expected "int"  [arg-type]

どのような型が使えるか

importを使用しないデフォルトの状態では、型はPythonの組み込み型が使用できます。
詳細はPythonドキュメント公式 を参考にしてください。

型名 表記 表示例
真偽型 bool True,False
文字列型 str "Hello","world"
整数型 int 0,1
浮動小数点数型 float 1.0,3.14
複素数型 complex (1+2j)
バイト型 bytes b'Hello'
バイト配列型 bytearray b'\x00\x00'
メモリビュー型 memoryview <memory at 0x10491c580>
リスト型 list [1,2]
タプル型 tuple (1,2)
レンジ型 range range(0,10)
セット型 set {'o', 'g', 'e', 'h'}
フローズンセット型 frozenset frozenset({'o', 'g', 'e', 'h'})
辞書型 dict {"x":1, "y":2}

おわりに

Pythonの型アノテーションは、コードの読みやすさや保守性を向上させる強力なツールです。適切に使用することで、関数やメソッドの引数や戻り値の型を明示し、コードの理解を容易にします。また、型チェッカーを活用することで、実行前に型の整合性を検証することができ、バグを早期に発見することができます。

型アノテーションを適切に利用することで、コードの品質を向上させ、信頼性の高いプログラムを構築することができます。是非、Pythonの型アノテーションを活用して、より効率的で安全なコードを書くための一歩を踏み出してみてください。[2]


[1] バグが0になるとは書けなかった
[2] ChatGPTにまとめ書いてもらいました

GitHubで編集を提案

Discussion