Jak zauważył @jonrsharpe w komentarzu, można to zrobić za pomocą typing.Callable:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
Problem w tym, Callableże sam jest tłumaczony na Callable[..., Any]co oznacza:
Funkcja wywoływana przyjmuje dowolną liczbę argumentów / typ i zwraca wartość dowolnego typu. W większości przypadków nie jest to to, czego chcesz, ponieważ pozwolisz na przekazanie prawie każdej funkcji. Chcesz, aby parametry funkcji i typy zwracane były również wskazywane.
Dlatego wiele typesz typingnich zostało przeciążonych, aby obsługiwać podskrypty, które oznaczają te dodatkowe typy. Więc jeśli na przykład masz funkcję, sumktóra zajmuje dwie intsekundy i zwraca int:
def sum(a: int, b: int) -> int: return a+b
Twoja adnotacja będzie wyglądać tak:
Callable[[int, int], int]
oznacza to, że parametry są subskryptowane w subskrypcji zewnętrznej, a typ zwracany jest drugim elementem w subskrypcji zewnętrznej. Ogólnie:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
Callable