Des outils pour vérifier le type statique en Python
Je travaille avec une large base de code Python et voudrais commencer à ajouter dans les annotations de type afin que je puisse obtenir un certain niveau de vérification statique. J'imagine quelque chose comme Erlang, Strongtalk, ou Tapé Jeu De Raquette.
J'ai vu quick-and-dirty décorateurs d'insertion dynamique de contrôles basés sur les paramètres de la fonction et le type de retour des annotations, mais je suis à la recherche de quelque chose qui est plus robuste et qui effectue des contrôles au moment de la compilation.
Quels sont les outils disponibles en ce moment pour ce genre de chose? Je suis familier avec les compilateurs et la vérification de type et je suis certainement prêt à améliorer incomplète outil si il a une bonne fondation.
(Note: je ne suis pas intéressé par une discussion sur les avantages/inconvénients de typage statique.)
MODIFIER: Un exemple:
def put(d, k, v):
d[k] = v
J'aimerais être capable d'annoter le put
fonction de type put<K,V>(dict<K,V>, K, V) -> None
.
Mise à JOUR: La nouvelle PEP 484 (Sep 2014) définit un standard pour le typage statique et annotations de type Python 3.5+. Il y a une vérification de type outil appelé mypy qui est compatible avec PEP 484.
- Vous êtes à la recherche pour Cython?
- Je ne le pense pas. Je veux un outil qui me permettra de trier de traiter régulièrement Python comme un langage statiquement typé. Je ne veux pas compiler les modules d'extension.
- Il n'y a pas de compilation chose sur Python... Il ne peut pas savoir les types avant d'exécuter le code.
- Vous ne pouvez pas toujours faire un travail parfait, mais il y a des outils que vous pouvez déduire beaucoup de choses. Par exemple: PySonar
- C'est donc presque impossible qu'il ne vaut pas la peine. Il est impossible en général comme vous le savez. Aussi, vous aurez besoin d'une version très évoluée structurels à taper pour obtenir même près de lui -
d[k] = v
mot avec chaque objetd
qui a__setitem__
, par exemple, et pas seulement avec instance dedict
. Selon le type ded
, il peut y avoir différents besoins incompatibles surk
(par exemple hashable, a__index__
) et même surv
. Et chaque objet a par exemple__hash__
, certains d'entre eux vient de "ne pas travailler" au moment de l'exécution. le typage Statique n'est pas possible en Python. - Faire un travail parfait n'est pas possible. je le sais. Mais Erlang, Smalltalk, et ont la vérification statique des outils qui sont encore utiles. Le
__setitem__
vérifier semble comme une norme structurelle vérification de type. Il existe des moyens pour spécifier un lien nécessaire entre les types ded
etk
. La mise en œuvre sélective de__hash__
n'est pas l'idéal, mais Java a le même problème avecUnsupportedOperationException
. Et même si je ne peux pas résoudre tous les problèmes, cela ne signifie pas que je ne peux pas avoir une vérification statique qui est toujours utile pour certaines choses. - Si vous voulez un moment de la compilation système de typage usage d'une langue qui a une. Python néophytes qui viennent d'un langage fortement typé ont souvent des attentes irréalistes que ce qu'ils sont familiers avec a en fait été d'aider autant qu'ils le pensaient. Que les programmeurs en C++ tenir compte du fait que les indices de tableau sont connus pour être dans la classe d'entiers à chaud est la vraie perplexité quand tout sauf une poignée de ces entiers sont désastreusement mal. Dans la pratique, l'incidence de Python erreurs de type approche de zéro.
- Toutes les raisons ci-dessus pourquoi Python ne pouvez pas avoir de la vérification des types statiques s'appliquent également au Régime et il est descendant de la Raquette. Mais facultatif statique type de vérification a été ajouté à la Raquette tout en préservant la "dynamique" de style de programmation de la langue. Progressive de frappe pour Python (Jeremy Siek et al, mentionné dans une réponse, devrait être publié prochainement) s'applique dans les mêmes idées, et de plus, de Python, de sorte qu'il peut être fait. Je pense que certains ont mal interprété la question comme "Peut-dynamique des vérifications être remplacé par vérifier le type statique?" clairement non, même en Java types statiques ne pas le faire.
- Je suis d'accord que statique type de vérification n'est pas possible pour tous programme en Python. Toutefois, pour certains sous-ensembles de lui, il est (c'est à dire ceux qui n'utilisent pas les caractéristiques dynamiques). Et pour encore plus de sous-ensemble, peut être de type statique vérifié 99,99% du temps. Je vais avoir beaucoup de difficulté à l'aide de Python en moyenne (pour ne pas dire grosse) des applications. À moins que la communauté arrive avec des solutions, Python seront relégués à de "petites choses"".
- Il est le nouveau "graduel" paquet que vous pourriez vouloir vérifier (voir la réponse ci-dessous). Vous devez annoter votre programme dans certaines régions, mais dans les autres cas, il semble très prometteur.
Vous devez vous connecter pour publier un commentaire.
Modifier 2016-11-11: suffit d'utiliser mypy. Type de conseils peuvent être ajoutés progressivement. En Python 3 du code source, il vérifie standard PEP 484 type de conseils. Les Types peuvent toujours être exprimé en Python 2 à l'aide d'observations particulières à formuler. Guido aime ça.
Ce post a été écrit à l'origine il y a longtemps avant mypy était une chose. J'ai conservé le poste de contenu original ci-dessous, même si elle n'est pas tout à fait exact.
Original post:
Vous pourriez vouloir vérifier certains des projets mentionnés dans le présent liées StackOverflow post sur l'analyse statique pour Python.
En résumé:
Depuis Python utilise duck-typing largement, les choses que l'on pourrait appeler "les erreurs de type" dans d'autres langues pourrait être "l'objet X ne prend pas en charge la méthode Y" en Python.
Modifier 2011-05-17:
Je suis d'accord avec delnan que le typage statique n'est pas possible pour Python [apparemment mal]. Mais depuis notre scepticisme ne semble pas dissuader vous, je ne peux que vous donner plus d'informations sur le sujet. Je vous présente:
Vous pouvez trouver mypy intéressant. Il a été proposé pour inclusion dans Python 3.5 par Guido.
Découvrez ce post: PySonar: un Analyseur Statique pour Python. PySonar est un outil qui déduit types à l'aide de l'interprétation abstraite (partiellement l'exécution du code. Il trouve tous les chemins d'exécution possibles de votre programme et trouve tous les types possibles de toutes les variables.
En gros, il existe trois versions de PySonar:
Aucun d'entre eux (à l'exception de "closed source") est pleinement mis en œuvre. Mais l'idée de base est que vous pouvez l'utiliser comme une base pour votre travail.
Je ne sais pas si cela aide, mais pour ce que ça vaut, Jeremy Siek à l'université du Colorado a travaillé sur le graduelle de frappe, et j'ai trouvé ce faire une recherche rapide.
http://www.wiki.jvmlangsummit.com/pdf/28_Siek_gradual.pdf
Je pense (je peux me tromper) est il n'y a pas prometteur open source outils que vous pouvez trouver dans le moment depuis sa recherche semble relativement nouvelle.
Votre meilleur pari serait de contacter les auteurs et leur demander s'ils peuvent libérer leur code pour vous.
Il y a le "graduel" de package pour Python 3; voir PIP ou la Bitbucket Repo
Apparemment, c'est une mise en œuvre par le groupe autour de Jeremy Siek qui semble être tout à fait une autorité dans le domaine de l'augmentation progressive de la frappe.
Quelques annotations sont apparemment nécessaire, voici un exemple:
Autant que les annotations go, ce n'est pas si mal. Je n'ai pas utilisé le package donc je ne peux pas parler à sa qualité, mais la syntaxe (et les gens qui sont derrière) certainement le faire paraître prometteur.
J'aime prospecteur, backend de paysage.io. Il combine sortie de les analyseurs existants, tels que pylint, pyflakes, pep8, givré..., dans un seul rapport. Neat.
J'avais un besoin similaire il y a quelques temps.
Toutes les solutions que j'ai trouvé avait un problème ou n'a pas une fonctionnalité que j'aimerais avoir, donc j'ai fait mon propre.
Voici comment l'utiliser:
J'espère que cela est utile pour vous.
Pour plus de détails, regardez:
P. S.: (me citer de dépôt github)