Je souhaite utiliser des indications de type dans mon projet actuel Python 3.5. Ma fonction doit recevoir une fonction en tant que paramètre.
Comment puis-je spécifier la fonction de type dans mes indications de type?
import typing
def my_function(name:typing.AnyStr, func: typing.Function) -> None:
# However, typing.Function does not exist.
# How can I specify the type function for the parameter `func`?
# do some processing
pass
J'ai vérifié PEP 48 , mais je n'y ai trouvé aucun indice de type de fonction.
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:
Le problème est, Callable
lui-même est traduit en Callable[..., Any]
ce qui signifie:
Un appelable prend un nombre quelconque 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 pratiquement toutes les fonctions. Vous souhaitez que les paramètres de fonction et les types de retour soient également suggérés.
C'est pourquoi de nombreux types
dans typing
ont été surchargés pour prendre en charge les sous-scripts qui désignent 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 ce serait:
Callable[[int, int], int]
c'est-à-dire que les paramètres sont sous-scriptés dans l'abonnement externe avec le type de retour comme deuxième élément de l'abonnement externe. En général:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
Un autre point intéressant à noter est que vous pouvez utiliser la fonction intégrée type()
pour obtenir le type d'une fonction intégrée et l'utiliser. Donc vous pourriez avoir
def f(my_function: type(abs)) -> int:
return my_function(100)
Ou quelque chose de cette forme