web-dev-qa-db-fra.com

Comment puis-je spécifier le type de fonction dans mes indications de type?

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.

73
Jon

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 ints 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]
99

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

3
Hallsville3