#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
Но вы должны дать ему несколько советов:
Если вы используете Python 3, среда разработки будет проверять аннотации функций следующим образом:
(Класс file был удален из python 3, поэтому я создал пример со строкой)
Это не бесплатная среда разработки, но, ИМХО, имеет лучшее доступное завершение кода.
Комментарии:
1. Это именно то, что я искал. Я должен был догадаться, что, возможно, кто-то использовал для этой цели function-docstrings . Это прекрасные вещи, строки документации. Я надеюсь, что смогу имитировать завершение кода при разборе строки документа в продукте с открытым исходным кодом, но пока я подумаю о покупке PyCharm, он выглядит великолепно.
Ответ №2:
У WingIDE также есть такой вывод типа, хотя он не открыт.