2009-09-25 8 views
10

Czy możliwe jest zastosowanie algorytmu Ocaml/Haskell typu wnioskowania, aby zaproponować lepsze autouzupełnianie dla Pythona?Wnioskowanie o typ Pythona dla autouzupełniania

Chodzi o to, aby zaproponować autouzupełnianie na przykład w następujących przypadkach:

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' 

Czy istnieją jakieś dobre punkty wyjścia?

+0

Większość dyskusji wspomnianych w poście Alex dotyczy 100% dokładności niezbędnej do kompilacji/wykonania. Ale jeśli chodzi o autouzupełnianie, to dobrze, chyba że powinno to uprościć problem? – Alfa07

+0

z mojego skrzydła rekolekcyjnego ide oferuje zakończenie. ale nie używałem go od jakiegoś czasu, więc nie jestem pewien – yairchu

Odpowiedz

9

Doskonała dyskusja, z wieloma wskazówkami, here (nieco przestarzałe). Nie wierzę, że jakikolwiek redaktor "produkcji" agresywnie wypróbowuje in-formatowanie w celu autouzupełniania (ale od jakiegoś czasu nie używałem np. Wingware, więc może robią to teraz).

+0

+1: dużo miłego materiału do czytania pod linkiem – ChristopheD

+0

+1: to był link, który zamierzałem opublikować. – LB40

0

Właściwe leczenie wymagałoby systemu typu dla Pythona, który byłby (jest?) Interesującym problemem badawczym.

2

Moglibyśmy spojrzeć na ECompletion i OCompletion w Pharo Smalltalk. Kompromisy prawdopodobnie będą różne dla Pythona, ale w praktyce sprawdzane są domysły z konserwatywną wnioskiem typu. Zależy to również od tego, czy chcesz zastąpić przeglądanie kodu/dokumentacji, czy też pomóc w pisaniu i uniknąć literówek.

Myślę, że w Pharo, jeśli wiadomość jest wyraźnym wysłaniem do klasy (SomeClass m), wówczas oczywiście zaproponuje wszystkie wiadomości w tej klasie i jej nadklasach. Inaczej po prostu zgaduje wszystkie nazwy metod w systemie, które pasują do wpisanego prefiksu, i to działa dobrze. OCompletion dodaje trochę heurystycznego priorytetu na podstawie historii edycji.

1

Pierwszy przypadek jest "łatwy" i założę się, że może to zrobić JetBrains' PyCharm. Nie używałem PyCharm, ale używam IDEA, również przez JetBrains, do programowania opartego na Groovy (dynamiczny język) i ma bardzo dobre, bardzo agresywne auto-uzupełnianie. Drugi przypadek byłby trudniejszy, chcesz, aby IDE określiło typ fun1 na podstawie jego użycia. W języku bez leków generycznych może to być uzasadnione. Jednak przynajmniej w F #/VS2010 (która prawdopodobnie byłaby podobna do OCaml/Haskell tutaj), kompilator/IntelliSense wnioskuje fun1, aby mieć podpis 'a -> 'a (to jest funkcja, która przyjmuje rodzaj ogólny 'a i zwraca typ ogólny 'a) więc IntelliSense jest bardzo cienki.