Среда разработки python с завершением кода, включая вывод типа параметра-объекта

#ide #python-3.x #type-inference #code-completion #python-2.7

#Среда разработки #python-3.x #вывод типа #завершение кода #python-2.7

Вопрос:

Я протестировал множество IDE Python на предмет их возможностей завершения кода. Существует ли такая среда, которая может выполнить завершение кода в следующем случае:

 def foo(x):
    print x.read()  // remove this line, and type in "print x."

def main():
    n = open("c:\python27\test.py");
    foo(n)
  

Среда разработки должна выяснить, что foo вызывается где-то в текущем модуле с параметром, который был возвращаемым значением из вызова open() , который он должен был бы считать вызовом file.open , и, таким образом, возвращает объект file . x. Таким образом, нажатие Ctrl Пробел вызовет завершение кода и покажет, что x, как объект file, может поддерживать любой метод объекта file, в том числе read() .

Я обнаружил, что PyScripter, например, может это сделать:

     n = open("c:\python27\test.py");
    n. // hit <ctrl space> after n.
  

Приведенный выше сценарий завершения кода работает, потому что PyScripter выполняет некоторую специальную логику завершения кода, чтобы определить, что n является файловым объектом, но, похоже, не существует способа вывести типы объектов или доступные методы из статического анализа, которые будут определять типы параметров.

Во-вторых, если ничего подобного не доступно в Python 2.x, в Python 3.x, теперь, когда есть подсказки статического типа, поддерживает ли их какая-либо среда разработки?

    def foo(x:'file'):
        print x.read()  // remove this line, and type in "print x." and hit ctrl space
  

Комментарии:

1. Первое невозможно. foo() может быть вызван с чем угодно. То, что он вызывается с файлом один раз, не является гарантией. Подсказки типа решают эту проблему, но я пока не знаю ни одной среды разработки, которая ее поддерживает, но я уверен, что это произойдет.

2. Согласен с Леннартом, это один из компромиссов при работе с языком, который не является строго типизированным.

3. Аннотации функций должны использоваться с типами, а не со строками…

4. Спасибо, я не знал, для чего их следует использовать.

Ответ №1:

Единственное, что, я думаю, может сделать (почти), это PyCharm

Но вы должны дать ему несколько советов:

Python2


Если вы используете Python 3, среда разработки будет проверять аннотации функций следующим образом:

Python3

(Класс file был удален из python 3, поэтому я создал пример со строкой)

Это не бесплатная среда разработки, но, ИМХО, имеет лучшее доступное завершение кода.

Комментарии:

1. Это именно то, что я искал. Я должен был догадаться, что, возможно, кто-то использовал для этой цели function-docstrings . Это прекрасные вещи, строки документации. Я надеюсь, что смогу имитировать завершение кода при разборе строки документа в продукте с открытым исходным кодом, но пока я подумаю о покупке PyCharm, он выглядит великолепно.

Ответ №2:

У WingIDE также есть такой вывод типа, хотя он не открыт.