Supposons que j'ai une fonction qui prend un type comme argument et renvoie une instance de ce type :
def fun(t):
return t(42)
Je peux alors l'appeler et obtenir des objets des types fournis :
fun(int) # 42
fun(float) # 42.0
fun(complex) # (42+0j)
fun(str) # "42"
fun(MyCustomType) # something
Cette liste n'est pas exhaustive, j'aimerais pouvoir utiliser n'importe quel type avec un constructeur approprié.
Ensuite, j'aimerais ajouter des indications de type pour cette fonction. Quel devrait être l'indice de type pour la valeur de retour de cette fonction ?
J'ai essayé en utilisant simplement t
comme t
est un type :
def fun(t: type) -> t:
return t(42)
mais ça ne marche pas :
main.py:1 : erreur : Le nom 't' n'est pas défini
Cette réponse suggère en utilisant un TypeVar
:
from typing import TypeVar
T = TypeVar("T")
def fun(t: T) -> T:
return t(42)
Mais cela ne semble pas être juste, car T
désigne un type, ce qui suggère que le type lui-même est retourné, et non son instance. Mypy le rejette :
main.py:6 : erreur : "object" not callable
Utilisation de Any
ça marche évidemment, mais je trouve que c'est trop vague, ça ne traduit pas l'intention :
from typing import Any
def fun(t: type) -> Any:
return t(42)