Подтвердить что ты не робот

Вывод типа Python для автозаполнения

Можно ли использовать алгоритм Ocaml/Haskell вывода типа, чтобы предложить лучшие автозаполнения для Python?

Идея состоит в том, чтобы предложить автозаполнение, например, в следующих случаях:

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'

Есть ли хорошие отправные точки?

4b9b3361

Ответ 1

Отличное обсуждение со многими указателями здесь (немного устарел). Я не верю, что никакие "производственные" редакторы агрессивно пробовали делать ввод-вывод для автозаполнения (но я не использовал, например, "крыло", а может быть, и сейчас).

Ответ 2

Вы могли бы взглянуть на ECompletion и OCompletion в Pharo Smalltalk. Компромиссы, вероятно, будут отличаться для python, но на практике обоснованные догадки с использованием некоторых консервативных типов. Это также зависит от того, хотите ли вы выполнить замену, просматривая код/​​документацию или помогая печатать и избегать опечаток.

Я думаю, что в Pharo, если сообщение является явной отправкой в ​​класс (SomeClass m), то, конечно, он предложит все сообщения в этом классе и его суперклассах. Кроме того, он просто угадывает все имена методов в системе, которые соответствуют типизированному префиксу, и это хорошо работает. OCompletion добавляет немного эвристической приоритетности, основанной на истории редактирования.

Ответ 3

Первый случай - "легкий", и я уверен, что "PyCharm" JetBrains может это сделать. Я не использовал PyCharm, но я использую IDEA, также JetBrains, для разработки Groovy (динамический язык), и у нее очень хорошее, очень агрессивное автозаполнение. Второй случай будет более сложным, вы хотите, чтобы IDE вывел тип fun1 на основе его использования. На языке без дженериков это может быть разумным. Однако в F #/VS2010 по крайней мере (что, вероятно, было бы похоже на OCaml/Haskell здесь), компилятор /IntelliSense выводит fun1 на подпись 'a -> 'a (т.е. Функцию, которая принимает общий тип 'a и возвращает общий тип 'a), поэтому IntelliSense очень тонкий.

Ответ 4

Для надлежащего лечения потребуется система типов для Python, которая была бы (является?) интересной исследовательской проблемой.