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