7
votes

Comment obtenir le type de paramètres et le type de retour d'une fonction?

J'essaie de mettre en œuvre une programmation génétique de type forte dans Python.

Y a-t-il quelque chose comme ces échantillons? p> xxx pré>

et p> xxx PRE>

MISE À JOUR: P>

J'essaie de générer l'expression de Python et d'éviter que quelque chose ne puisse pas être évalué comme celui-ci: P>

funcA(20, funcA(True, "text"))


1 commentaires

Veuillez mettre à jour votre question avec le problème exact que vous essayez de résoudre, pour lequel vous pensez que c'est la solution , car dans un langage typiquement typé comme Python, ce type de paradigme n'a pas de sens. Vous pourriez-vous le faire si vous avez passé vos propres objets, mais je me demande à nouveau la sagesse d'une telle exigence.


7 Réponses :


0
votes

aucune chance. Étant donné que Python utilise la typing de canard, vous pouvez passer des paramètres de différents types, par ex. int et int, str et str, etc. à Funca. Il n'y a aucune chance de dire quel type de retour et quel type de paramètre peut être sans voir les paramètres réels


0 commentaires

2
votes

Le meilleur moyen est d'utiliser Docstrings pour stocker de telles informations sur la fonction et

In [49]: def funcA(a,b):
   ....:     ''' returns an int '''
   ....:     return int(a+b)
   ....:

In [50]: funcA.__doc__
Out[50]: ' returns an int '


2 commentaires

+1 Pour DOCString, bien que cela soit juste, vous devriez avoir retour int (A + B) .


Il convient de noter que forcer des choses à être de certains types est une mauvaise idée de Python, car elle rend vos fonctions moins utiles.



7
votes

Python 3 introduit les annotations de fonction. Par eux-mêmes, ils ne font rien, mais vous pouvez écrire votre propre application:

def strict(fun):
    # inspect annotations and check types on call

@strict
def funcA(a: int, b: int) -> int:
    return a + b 


11 commentaires

Encore une fois, il convient de noter que la vérification du type est généralement une mauvaise idée. Cela rend vos fonctions moins utiles et en général, ne vous aide pas vraiment. Dans certaines situations, très spécifiques, cela peut être utile, mais ne devrait pas être fait comme une question, si vous le souhaitez, écrivez plutôt Java.


Mais c'est une bonne idée de mon problème: D C'est génial de voir que Python peut être fort typé, dactylographié et dynamique strict.


Malheureusement, aucune vérification n'est effectuée au type de compilation et rien ne peut être fait à cause de la nature de la langue. Je ne dirais pas que cela ressemble à un "fort typé" classique. Bien sûr, vous pouvez effectuer des contrôles de type que vous souhaitez. Mais seulement à l'heure d'exécution.


@Latty Vous dites que le type de vérification est généralement une mauvaise idée, mais en Python n'est pas un tapis de canard / polymorphe / paresseux vraiment populaire? Ou ai-je tort? (Aussi j'ai tort de penser que le canard, polymorphe et paresseux sont tous des synchrones les uns des autres lorsqu'il s'agit de taper?)


@JoSiethompson dactylographie de dactylographie signifie s'appuyer sur les capacités d'un objet (comporte-il un charce de charlatan () méthode?) Pour déterminer son identité (si elle le fait, c'est un canard). Le type de vérification est l'endroit où vous cochez le type réel qu'un objet a été fabriqué à partir de (est-ce un objet Duck ?).


@GaTréthlatty Dans la plupart des cas (au moins dans mon cas), je choisis la langue de mise en œuvre pour un projet, basé sur le contexte, les objectifs et parfois sur le cadre que j'ai besoin d'utiliser; pas parce que je veux avoir des valeurs de retour spécifiques. La spécification du type de retour le rend 100 fois plus facile pour les autres de lire et de comprendre certaines fonctionnalités de code. Il n'est pas très pratique d'avoir à lire toute la documentation d'une fonction / méthode, juste pour voir comment il retourne ce qu'il revient. Si la documentation est mauvaise, vous devez lire le corps de la méthode réelle. Je crois généralement que Python est une abomination.


@ P.Soutzikevich J'ai vu beaucoup de code défaillant dans des langues strictement typées car généralement un type ne vous dit pas tout ce que vous devez savoir. Vous avez besoin d'une bonne documentation de toute façon. Ne disant pas que les types ne peuvent pas être utiles, mais les langues dactylographiées de canard ont une place et peuvent être extrêmement bons pour certaines utilisations.


@Garethlatty Oui, écrire une bonne documentation est ma règle n ° 1. Je crois que beaucoup de mes collègues détestent quand j'enveloppe de la documentation (qui est tout le temps). Pourtant, une mauvaise documentation existe et existera toujours, car elle est dans la nature de la majorité des programmeurs, de ne pas se soucier de rien d'autre que de faire fonctionner le code. J'ai accepté que: P mon point ultime est que la dactylographie stricte aide à répondre rapidement à certaines questions, dans les cas où la documentation est insuffisante.


@ P.soutzikevich Sauf souvent la frappe devient une béquille à utiliser pour excuser une documentation médiocre - c'est anecdotique, mais j'ai rencontré plus de projets Python avec une grande documentation et des tonnes de projets Java avec des Javadocs générés automatiquement. Il y a une culture de la documentation en Python, qui est en partie dû à la nature. Rejet de la langue parce qu'il n'offre pas cet outil particulier est une vue à courte vue, à mon avis - et Python est le meilleur choix pour certaines choses. Je ferais également prudent de jeter des pierres de maisons de verre, car le système de type de Java n'est pas parfait.


@Garethlatty votre dernier commentaire est subjectif et basé sur l'opinion. Si vous relisez mon commentaire initial, vous verrez que "J'ai choisi un programme. Langue basée sur le contexte d'un projet [..]" et non sur des caractéristiques non fonctionnelles telles que dactylographie fort. En fait, je n'aime pas Python pour mille raisons et pourtant pour ma thèse MSC, j'ai écrit tout le système pour le projet en Python ( indice, indice ). Peut-être que je vous ai offensé en appelant votre langue aller-à une abomination; Mais ce n'était jamais mon intention car c'est juste mon opinion personnelle. P.S: Je n'ai jamais mentionné Java?!? Métaphore cool tho


@ P.soutzikevich j'ai choisi Java parce que vous aviez une activité sur la balise, mais mon point était qu'aucun système de type n'est parfait. Je ne sais pas pourquoi vous essayez de transformer cela en argument personnel, je ne pensais tout simplement pas que «je crois généralement que Python est une abomination» était un commentaire constructif qui devrait aller sans réponse, mais je ne veux pas Entrez dans une sorte de guerre de la flamme de la langue. Vous semblez avoir un grand problème avec la langue, et c'est votre choix, mais je ne suis pas sûr de savoir pourquoi vous avez décidé d'apporter cela à un thread de commentaire non liée - ce n'est pas du tout productif.



0
votes

Il est impossible de savoir de la seule fonction que cela ne devrait être valable que pour les entiers. Si vous l'appelez avec des paramètres entier: xxx pré>

vous obtenez 3 code>, un entier, mais qu'en est-il: p>

funcA("Test", "Test")


2 commentaires

Ce n'est vraiment pas impossible: vous pouvez utiliser MonkeyType pour déduire les types de paramètres et retour d'une fonction taper.


@Andersongreen Cette réponse a 8 ans, alors oui, il y a maintenant des options ici, et il peut maintenant être plus viable d'aborder quelque chose comme ça, mais il vaut la peine de noter - comme les documents que vous avez liés sur le point - pendant que vous pouvez déduire ces Les choses, mais ce n'est qu'une inférence et est susceptible de manquer d'options potentiellement valides, ou d'inclure ceux invalides.



4
votes

dans le type de retour Python n'est pas connu tant que l'appel est effectué et retour est exécuté. Il peut même être différent dans différentes situations, une réponse brève est donc "non possible".

Si vous devez connaître le type de retour pour certaines fonctions, vous pouvez toujours l'envelopper dans un code de contrôle de type qui peut également exposer la déclaration taper. Cependant, ce serait plutôt unpythonic: xxx

upd: Vous pouvez faire la même chose aux types de paramètres et à les vérifier également.


0 commentaires

10
votes

en Python, une langue dactylographiée dynamiquement, les informations de type des paramètres d'une fonction sont nécessaires au moment de l'exécution. En 3.3 et plus tard, vous pouvez obtenir le type d'une fonction comme suit: xxx

voir https://docs.python.org/3/library/inspect.html#introspecting-callables-with-Le-Signature-Object < / a>


0 commentaires

5
votes

Vous pouvez vérifier cela avec des annotations: xxx

et identique avec les paramètres: xxx


0 commentaires