Callable 型ヒントを使うと、関数を引数として受け取る関数や、関数を返す関数の型を明確に表現できます。
基本的な使い方
Callable は Callable[[引数の型], 戻り値の型] の形式で指定します。
from typing import Callable def apply_twice(func: Callable[[int], int], value: int) -> int: return func(func(value)) def add_one(x: int) -> int: return x + 1 result = apply_twice(add_one, 5) print(result) # 7
複数の引数を持つ関数
引数が複数ある場合は、リストに列挙します。
from typing import Callable def operate(func: Callable[[int, int], int], a: int, b: int) -> int: return func(a, b) def add(x: int, y: int) -> int: return x + y result = operate(add, 3, 4) print(result) # 7
引数なしの関数
引数がない場合は空のリストを使います。
from typing import Callable def call_factory(factory: Callable[[], str]) -> str: return factory()
任意の引数を取る関数
引数の詳細を指定しない場合は ... を使います。
from typing import Callable def execute(func: Callable[..., None]) -> None: func()
デコレータの型付け
デコレータは「関数を受け取り関数を返す」ので、Callable を組み合わせて表現します。
from typing import Callable, TypeVar F = TypeVar("F", bound=Callable[..., object]) def my_decorator(func: F) -> F: def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper # type: ignore
Callable を活用すると、高階関数の意図がコード上で明確になります。