2009-09-25 27 views
10

¿Es posible utilizar el algoritmo Ocaml/Haskell de inferencia de tipo para sugerir mejores autocompletaciones para Python?Inferencia de tipo Python para autocompletar

La idea es proponer la terminación automática, por ejemplo, en los siguientes casos:

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' 

¿Hay buenos puntos de partida?

+0

La mayor parte de la discusión mencionada en la publicación de Alex se refiere al 100% de precisión que es necesaria para la compilación/ejecución. Pero para el autocompletado, una buena suposición es lo suficientemente buena, ¿probablemente debería simplificar el problema? – Alfa07

+0

desde mi recuerdo ala ide ofrece algo de terminación. pero no lo he usado desde hace un tiempo, así que no estoy seguro de – yairchu

Respuesta

9

Excelente discusión, con muchos indicadores, here (un poco anticuado). No creo que ningún editor de "producción" intente agresivamente con la escritura de texto para fines de autocompletado (pero no he usado, por ejemplo, los de wingware en un tiempo, así que tal vez lo hagan ahora).

+0

+1: un montón de buen material de lectura en el enlace – ChristopheD

+0

+1: ese era el enlace que iba a publicar. – LB40

0

Un tratamiento adecuado requeriría un sistema de tipo para Python, que sería (¿es?) Un problema de investigación interesante.

2

Puede echar un vistazo a ECompletion y OCompletion en Pharo Smalltalk. Los compromisos probablemente serán diferentes para python, pero las suposiciones educadas con algún tipo de inferencia de tipo conservador funcionan en la práctica. También depende si desea que se complete para examinar el código/la documentación, o para ayudar a escribir y evitar errores tipográficos.

Creo que en Pharo, si el mensaje es un envío explícito a una clase (SomeClass m), por supuesto, propondrá todos los mensajes de esa clase y sus superclases. De lo contrario, solo adivina todos los nombres de métodos en el sistema que coinciden con el prefijo escrito, y eso funciona bien. OCompletion agrega un poco de priorización heurística basada en el historial de edición.

1

El primer caso es "fácil", y apuesto a que JetBrains' PyCharm puede hacer eso. No he usado PyCharm, pero sí uso IDEA, también de JetBrains, para el desarrollo basado en Groovy (un lenguaje dinámico), y tiene una autocompletación muy buena y muy agresiva. El segundo caso sería más difícil, desea que el IDE infiera el tipo de fun1 en función de su uso. En un lenguaje sin genéricos, esto puede ser razonable. Sin embargo, en F #/VS2010 al menos (que probablemente sería similar a OCaml/Haskell aquí), el compilador/IntelliSense inferir fun1 para tener la firma 'a -> 'a (es decir, una función que toma un tipo genérico 'a y devuelve un tipo genérico 'a) entonces IntelliSense es muy delgado.

Cuestiones relacionadas