Pythonにおける型
この記事ではPythonにおける型について説明します。
YouTube Video
Pythonにおける型
Pythonのtyping
モジュールは、Pythonに型ヒントを導入するために利用されるモジュールです。もともとはPython 3.5で導入され、コードの可読性やメンテナンス性を向上させるために使われます。型ヒントは、コードの実行時には影響を与えませんが、IDEや静的解析ツールによって型のチェックが可能になります。
型ヒントの基本
型ヒントは関数や変数に対して、その型を明示することでコードの意図を明確にします。以下の例では、引数と戻り値に型を指定しています。
1def add_numbers(a: int, b: int) -> int:
2 return a + b
3
4result: int = add_numbers(5, 10)
5print(result) # 15
上記のコードでは、a
とb
は整数型(int
)であり、関数の戻り値も整数型であることを明示しています。型ヒントがあっても、型が厳密に強制されるわけではありませんが、開発時に型のミスマッチがあれば警告が表示される場合があります。
主要な型ヒント
Pythonのtyping
モジュールには、さまざまな型ヒントを定義するためのクラスや関数が用意されています。以下は代表的な型ヒントの一覧です。
int
: 整数str
: 文字列float
: 浮動小数点数bool
: 真偽値List
: リストDict
: 辞書Tuple
: タプルSet
: セット
List
型
リスト型は、List
クラスで指定します。リスト内の要素の型も明示することが可能です。
1from typing import List
2
3def sum_list(numbers: List[int]) -> int:
4 return sum(numbers)
5
6print(sum_list([1, 2, 3])) # 6
この例では、リストの要素がすべてint
型であることを期待しています。
Dict
型
辞書型は、Dict
を使って定義します。キーと値の型を指定することができます。
1from typing import Dict
2
3def get_student_age(students: Dict[str, int], name: str) -> int:
4 return students.get(name, 0)
5
6students = {"Alice": 23, "Bob": 19}
7print(get_student_age(students, "Alice")) # 23
この例では、キーがstr
型で、値がint
型の辞書が使われています。
Tuple
型
タプルは、Tuple
型を使用して指定します。タプルの各要素の型をそれぞれ指定することが可能です。
1from typing import Tuple
2
3def get_person() -> Tuple[str, int]:
4 return "Alice", 30
5
6name, age = get_person()
7print(name, age) # Alice 30
ここでは、get_person
関数が文字列と整数を含むタプルを返すことを示しています。
Union
型
Union
型は、複数の型を受け付けることを明示したい場合に使用します。
1from typing import Union
2
3def process_value(value: Union[int, float]) -> float:
4 return value * 2.0
5
6print(process_value(10)) # 20.0
7print(process_value(3.5)) # 7.0
この例では、process_value
関数がint
またはfloat
を引数として受け取り、float
型で結果を返すことを示しています。
Optional
型
Optional
型は、ある変数がNone
である可能性がある場合に使用します。これは、Union[Type, None]
の簡略化として提供されています。
1from typing import Optional
2
3def greet(name: Optional[str] = None) -> str:
4 if name is None:
5 return "Hello, Guest!"
6 return f"Hello, {name}!"
7
8print(greet()) # Hello, Guest!
9print(greet("Alice")) # Hello, Alice!
ここでは、name
が指定されない場合にNone
として扱うことを示しています。
ジェネリック型
ジェネリック型は、データ構造がどの型の要素を持つかを抽象化して表現する方法です。typing
モジュールでは、TypeVar
を使ってジェネリックな型を定義できます。
1from typing import TypeVar, List
2
3T = TypeVar('T')
4
5def get_first_element(elements: List[T]) -> T:
6 return elements[0]
7
8print(get_first_element([1, 2, 3])) # 1
9print(get_first_element(["a", "b", "c"])) # a
この例では、get_first_element
はリストの最初の要素を返す関数で、リストがどの型であっても動作することがわかります。
型エイリアス
型エイリアスは、複雑な型定義をわかりやすくするために別名をつける方法です。
1from typing import List, Tuple
2
3Coordinates = List[Tuple[int, int]]
4
5def get_coordinates() -> Coordinates:
6 return [(0, 0), (1, 1), (2, 2)]
7
8print(get_coordinates()) # [(0, 0), (1, 1), (2, 2)]
この例では、Coordinates
という型エイリアスを定義し、リスト内にタプルを含む型をシンプルに表現しています。
まとめ
Pythonのtyping
モジュールは、コードの可読性やメンテナンス性を向上させるために非常に有用です。型ヒントを適切に活用することで、特に大規模なプロジェクトやチーム開発において、型の不一致やバグを未然に防ぐ手助けとなります。型はあくまで開発時のサポートツールであり、実行時に影響を与えないため、コードの柔軟性も維持されます。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。