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 types
z typing
nich zostało przeciążonych, aby obsługiwać podskrypty, które oznaczają te dodatkowe typy. Więc jeśli na przykład masz funkcję, sum
która zajmuje dwie int
sekundy 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