Je souhaite utiliser des indices de type dans mon projet Python 3.5 actuel. Ma fonction devrait recevoir une fonction en paramètre.
Comment puis-je spécifier la fonction de type dans mes indices 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 483 , mais je n'ai pas trouvé d'indice de type de fonction.
Callable
Réponses:
Comme @jonrsharpe l'a noté dans un commentaire, cela peut être fait avec
typing.Callable
:Le problème est
Callable
que seul est traduitCallable[..., 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
danstyping
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 fonctionsum
qui prend deuxint
s et renvoie unint
:Votre annotation pour cela serait:
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:
la source
typing
truc déplace tout le langage python d'un cran.Callable[[Arg, Types, Here], ...]
pour*args
,**kwargs
args mots clés seulement et seulement args position? N'ont-ils pas pensé à appeler la convention dans les signatures de type pour les appelables? ;)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. Alors tu pourrais avoirOu quelque chose de cette forme
la source
builtin_function_or_method
commemy_function
? Ne serait-ce pas unlambda
travail? Une fonction définie par l'utilisateur ou une méthode liée?