Je recherche un analogue de decltype en C ++. Ce que j'essaie d'accomplir est le suivant:
def f(a: int) -> List[Tuple(int, float)]
def g(a: List[int]) -> List[decltype(f)]
L'idée est donc d'utiliser l'annotation de type d'une autre fonction. La solution que j'ai trouvée semble en quelque sorte maladroite:
def g(a: List[int])->f.__annotations__['return']
Fondamentalement, la question est de savoir s'il existe quelque chose comme decltype (peut-être qu'il devrait être appelé "return_type") ou s'il est prévu dans d'autres versions. J'ai également écrit une petite fonction qui illustre l'utilisation possible de cette fonctionnalité:
def return_type(f: Callable):
try:
return get_type_hints(f)['return']
except(KeyError, AttributeError):
return Any
def g() -> return_type(f):
UPD Comme suggéré par Jim Fasarakis-Hilliard, nous pouvons également utiliser get_type_hints au lieu d' annotations
Rien de tel n'existe actuellement et aucun problème sur le tracker de saisie ne semble indiquer que c'est prévu. Vous êtes toujours le bienvenu pour créer un problème et voir comment cela est le bienvenu.
Actuellement, votre approche fait l'affaire (c'est-à-dire attribue un type), le seul changement que j'apporterais serait d'utiliser à get_type_hints
partir de typing
plutôt que de saisir __annotations__
directement l' attribut. Couplé avec .get
(puisqu'il renvoie un dict), cela pourrait également raccourcir:
def return_type(f):
return get_type_hints(f).get('return', Any)
def g() -> return_type(f):
Ce qui peut bien sûr être supprimé de la fonction et utilisé en une seule ligne si vous le souhaitez.
Si la possibilité que des objets aléatoires soient fournis aux return_type
sorties, vous devrez attraper le TypeError
qu'il déclenche et renvoyer votre valeur par défaut Any
:
def return_type(f):
try:
return get_type_hints(f).get('return', Any)
except TypeError:
return Any
Bien sûr, étant donné que cela affecte un type de manière dynamique, vous ne pouvez pas vous attendre à ce que les vérificateurs de type statique l'attrapent, vous avez besoin d'indices statiques pour cela.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots