Pythonにおける型

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

上記のコードでは、abは整数型(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チャンネルもご覧ください。

YouTube Video