Comme @jonrsharpe l'a noté dans un commentaire, cela peut être fait avec typing.Callable:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
Le problème est Callableque seul est traduit Callable[..., Any]ce qui signifie:
Un appelable prend n'importe quel nombre d' arguments / type et renvoie une valeur de n'importe quel type. Dans la plupart des cas, ce n'est pas ce que vous voulez car vous autoriserez à peu près n'importe quelle fonction à passer. Vous voulez que les paramètres de fonction et les types de retour soient également indiqués.
C'est pourquoi beaucoup de typesdans typingont été surchargés pour prendre en charge le sous-scripting qui dénote ces types supplémentaires. Donc si, par exemple, vous aviez une fonction sumqui prend deux ints et renvoie un int:
def sum(a: int, b: int) -> int: return a+b
Votre annotation pour cela serait:
Callable[[int, int], int]
autrement dit, les paramètres sont sous-scriptés dans l'abonnement externe avec le type de retour comme deuxième élément dans l'abonnement externe. En général:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
Callable