PYTHON MEBY

Pythonで関数に型ヒントをつける (Python 3.5以降)

この記事ではPython 3.5以降で導入された関数への型ヒントの付け方、メリット、そして活用方法について解説します。型ヒントによるコードの可読性向上、バグの早期発見、静的解析ツールの活用方法を学びます。

目次

型ヒントの基礎

Pythonは動的型付け言語ですが、3.5以降、型ヒントを用いて変数や関数の型を指定できるようになりました。型ヒントは実行時の型チェックには使用されませんが、コードの可読性向上や静的解析ツールによるバグ検出に役立ちます。

name: str = "Alice"
age: int = 30

上記の例では、変数`name`は文字列型、`age`は整数型であることを示しています。`=`の右側は初期値です。型ヒントは`:`の後に記述します。

関数の型ヒント

関数の引数と戻り値の型を指定することで、関数のインターフェースを明確に記述できます。

def greet(name: str) -> str:
    return "Hello, " + name
print(greet(name="Bob"))

この例では、`greet`関数は文字列型の引数`name`を受け取り、文字列型を返します。`->`の後に戻り値の型を指定します。

戻り値の型ヒント

関数の戻り値の型を指定するには、`->`の後に型を記述します。複数の戻り値がある場合は、`Tuple`を使用します。

from typing import Tuple
def get_user(id: int) -> Tuple[str, int]:
    return "Bob", 30
name, age = get_user(id=1)
print(name, age)

この例では、`get_user`関数は`Tuple[str, int]`型、つまり文字列と整数のタプルを返します。

複数の戻り値

関数が複数の値を返す場合、戻り値の型ヒントには`typing.Tuple`を使います。

from typing import Tuple
def get_data() -> Tuple[int, str, bool]:
    return 1, "hello", True
number, text, boolean = get_data()
print(number, text, boolean)

この例では、`get_data()`関数は整数、文字列、ブール値のタプルを返します。

オプション引数とデフォルト値

オプション引数(デフォルト値を持つ引数)の型ヒントは通常の引数と同じです。

def calculate(x: int, y: int = 0) -> int:
    return x + y
print(calculate(5)) 
print(calculate(5, 3))

この例では、`y`はオプション引数で、デフォルト値は0です。

リスト、辞書などの型ヒント

リスト、辞書などのコレクション型の型ヒントには`typing`モジュールを使用します。

from typing import List, Dict
def process_data(data: List[int]) -> Dict[str, int]:
    return {"sum": sum(data)}
print(process_data([1, 2, 3]))

この例では、`process_data`関数は整数型のリストを受け取り、文字列をキー、整数を値とする辞書を返します。

型ヒントと静的解析

MyPyなどの静的解析ツールを使うことで、型ヒントに基づいてコードの型エラーを検出できます。

def add(a: int, b: int) -> int:
    return a + b
result = add(5, "10") # 型エラー

MyPyを実行すると、`add`関数への引数の型が間違っていることを検出します。

型ヒントのメリットとデメリット

型ヒントを使用するメリットは、コードの可読性向上、バグの早期発見、コードのメンテナンス容易化です。デメリットは、記述が冗長になる可能性がある点です。しかし、大規模なプロジェクトやチーム開発では、型ヒントによるメリットの方が大きくなります。

関連記事