Python の Callable による関数型の指定
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 を活用すると、高階関数の意図がコード上で明確になります。