Pythonは静的型付け言語じゃないから厳密にジェネリクスはできないけど、型を明示するTypingでジェネリクスぽいことをすることができる。
typeingのGenericを使ったジェネリクスのサンプル実装
以下のサンプルは2つの値のペアのリストを保持するクラスです。
2つの値は自由にクラスを指定できます。
8行目のようにGenericsに型クラスを渡して継承することでジェネリクスが使えるようになります。型クラスはクラス内で使用できます。
使い方は19行目のように、value: ジェネリクス適用したクラス[与えたい型…] = ジェネリクス適用したクラス といった感じです。
PyCharmだと20行目のように指定した型以外の値を指定すると警告が出ます。
from typing import Generic, TypeVar, Tuple, List
# 受け取る型クラス
T1 = TypeVar("T1")
T2 = TypeVar("T2")
class PairList(Generic[T1, T2]):
def __init__(self):
self._ls: List[Tuple[T1, T2]] = []
def add(self, v1: T1, v2: T2):
self._ls.append((v1, v2))
def get(self, i: int) -> Tuple[T1, T2]:
return self._ls[i]
# 型クラスの指定
a: PairList[str, int] = PairList()
a.add(1, "") # ここで警告が出る
a.add("", 12)