2009-09-25 5 views
10

Est-il possible d'utiliser l'algorithme d'inférence de type Ocaml/Haskell pour suggérer de meilleures complétions automatiques pour Python?Inférence de type Python pour l'auto-complétion

L'idée est de proposer autocomplétion par exemple dans les cas suivants:

class A: 
    def m1(self): 
    pass 
    def m2(self): 
    pass 

a = A() 
a.  <--- suggest here 'm1' and 'm2' 
fun1(a) 

def fun1(b): 
    b. <--- suggest here 'm1' and 'm2' 

Y a-t-il des bons points de départ?

+0

La majeure partie de la discussion mentionnée dans la publication Alex concerne la précision de 100% qui est nécessaire pour la compilation/l'exécution. Mais pour l'autocomplétion bonne estimation est assez bien, probablement cela devrait simplifier le problème? – Alfa07

+0

de mon aile de rappel offre une certaine complétion. mais je ne l'ai pas utilisé depuis un moment donc je ne suis pas sûr – yairchu

Répondre

9

Excellente discussion, avec de nombreux pointeurs, here (un peu daté). Je ne crois pas que les éditeurs de "production" essaient agressivement l'inférence de type à des fins de saisie semi-automatique (mais je n'ai pas utilisé par exemple wingware dans un moment, alors peut-être qu'ils le font maintenant).

+0

+1: Beaucoup de bon matériel de lecture sur le lien – ChristopheD

+0

+1: c'était le lien que j'allais poster. – LB40

0

Un traitement approprié nécessiterait un système de type pour Python, ce qui serait (est?) Un problème de recherche intéressant.

2

Vous pouvez jeter un oeil à ECompletion et OCompletion dans Pharo Smalltalk. Les compromis seront probablement différents pour python, mais des suppositions éclairées avec une inférence de type conservatrice fonctionnent dans la pratique. Cela dépend aussi si vous voulez que l'achèvement remplace la navigation dans le code/la documentation, ou pour aider à taper et éviter les fautes de frappe.

Je pense que dans Pharo, si le message est un envoi explicite à une classe (SomeClass m) alors bien sûr il proposera tous les messages dans cette classe et ses superclasses. Sinon, il devine juste tous les noms de méthodes dans le système qui correspondent au préfixe tapé, et cela fonctionne bien. OCompletion ajoute un peu de hiérarchisation heuristique basée sur l'historique d'édition.

1

Le premier cas est "facile", et je parie que JetBrains' PyCharm peut le faire. Je n'ai pas utilisé PyCharm, mais j'utilise IDEA, également par JetBrains, pour le développement basé sur Groovy (un langage dynamique), et il a une très bonne auto-complétion. Le second cas serait plus difficile, vous voulez que l'IDE déduise le type de fun1 en fonction de son utilisation. Dans une langue sans génériques, cela peut être raisonnable. Cependant, dans F #/VS2010 au moins (qui serait probablement similaire à OCaml/Haskell ici), le compilateur/IntelliSense infère fun1 pour avoir la signature 'a -> 'a (c'est-à-dire une fonction qui prend un type générique 'a et retourne un type générique 'a) donc IntelliSense est très mince.

Questions connexes