Comme @jonrsharpe noté dans un commentaire, cela peut être fait avec typing.Callable
:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
La question est, Callable
en soi, est traduit en Callable[..., Any]
ce qui signifie :
Un callable prend tout nombre/type de et renvoie une valeur de n'importe quel type. Dans la plupart des cas, ce n'est pas ce que vous voulez puisque vous autorisez pratiquement n'importe quelle fonction à être passée. Vous voulez que les paramètres de la fonction et les types de retour soient également indiqués.
C'est pourquoi beaucoup types
en typing
ont été surchargés pour prendre en charge les sous-scripteurs qui désignent ces types supplémentaires. Ainsi, si, par exemple, vous aviez une fonction sum
qui prend deux int
et renvoie un int
:
def sum(a: int, b: int) -> int: return a+b
Votre annotation pour cela serait :
Callable[[int, int], int]
c'est-à-dire que les paramètres sont sous-scrits 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]
31 votes
Une fonction est
Callable
3 votes
python.org/dev/peps/pep-0483/#fundamental-building-blocks Dernier point avant "nous pourrions ajouter".