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 objet d qui a __setitem__, par exemple, et pas seulement avec instance de dict. Selon le type de d, il peut y avoir différents besoins incompatibles sur k (par exemple hashable, a __index__) et même sur v. 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 de d et k. La mise en œuvre sélective de __hash__ n'est pas l'idéal, mais Java a le même problème avec UnsupportedOperationException. 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.