2.17. 型ヒント

Python では、関数のパラメータと戻り値に型情報で注釈(アノテーション)を付けることができます。この注釈は実行時には無視されます -- 何もそれをチェックせず、それに基づいて変換もしません -- が、読み手と IDE にとってのドキュメントの役割を果たします。

2.17.1. 注釈の構文

パラメータの注釈はコロンの後ろに置きます。戻り値の型は -> の後ろ、本体のコロンの前に置きます。

def greet(name: str) -> None:
    print("hello,", name)

def add(a: int, b: int) -> int:
    return a + b

def average(values: list) -> float:
    return sum(values) / len(values)

ヒントは、何を渡すべきか、そして何が返されるはずかを表します。add("hi", "there") を呼び出してもエラーにはなりません -- Python はそれでも本体を実行します。ヒントは契約であって、チェックではありません。

パラメータは、デフォルトと注釈の両方を持つことができます。

def greet(name: str, greeting: str = "hello") -> None:
    print(greeting, name)

CPython には、typing モジュールを通じてより豊かな記法(OptionalUnion、ジェネリクス)がありますが、それらは MicroPython では重く、日常的なカメラのコードではめったに必要ありません。

2.17.2. 実行時の MicroPython

MicroPython は注釈をパースした後、それを無視します。カメラ上にインポートできる typing モジュールはありません。Optional[int]list[int] を使おうとすると、ファームウェアのビルドによって、インポートに失敗するか、暗黙のうちに単なる属性アクセスとして振る舞います。

注釈では、単純な型名(intfloatstrboolbyteslisttupledict)にとどめてください。これらは実行時のコストがゼロで、意図を明確に伝えます。

2.17.3. IDE での活用方法

IDE は注釈を読み取って、ツールチップ、オートコンプリート、インラインヒントを動かします。-> int と注釈された関数は、カーソルが呼び出しの上にあるとき、戻り値の型として int を表示します。: str と注釈されたパラメータは、関数本体内でその引数に対して文字列のメソッドをオートコンプリートします。

これが、注釈を無視するランタイム上で注釈を書くことの実用的な見返りです。スクリプトがカメラ上で実行されるときには一切コストをかけずに、エディタからのより良いサポートが得られるのです。

2.17.4. 変数の注釈

単純な代入に対する注釈も、同じように機能します。

threshold: float = 0.5
name: str = "OpenMV"

これらも実行時には無視されます。主な用途は、右辺がそれを明らかにしないときに、意図された型を明確にすることです -- 通常は、初期値が後で置き換えられるプレースホルダである場合です。