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 Callable
que 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 types
dans typing
ont é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 sum
qui prend deux int
s 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