Завершение кода Pydev для всего

Во многих случаях (например, параметры функции) Pydev статически не знает тип переменной. Поэтому завершение кода (после . или при использовании ctrl+space) не работает.

В большинстве случаев вы знаете, какой тип будет использоваться во время разработки программного обеспечения. Есть ли способ намекнуть Pydev, чтобы он правильно завершил код?

Я предполагаю, что для этого может потребоваться определенная функция Pydev или, возможно, даже новый PIP Python.

На самом деле это общая проблема со всеми динамическими языками...

ОБНОВЛЕНИЕ:
Возможно, приведен пример для пояснения:

def some_func(a_list, an_object):
    a_list.app        # Here I would not get code completion for append

Пример того, что может работать, если Pydev (или PIP) поддерживает это:

from someobj import SomeObject
def some_func(a_list, an_object):
    # typecast: a_list=list
    # typecast: an_object=SomeObject
    a_list.app        # Now code completion would show append

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


person Jonathan    schedule 02.06.2011    source источник
comment
Вы имеете в виду, помимо добавления аннотаций типов, отсутствие которых является одним из преимуществ динамических языков?   -  person    schedule 03.06.2011
comment
@дельнан - да! Не поймите меня неправильно, я полностью поддерживаю отказ от обязательных аннотаций. Я думал о том, чтобы иметь возможность добавлять их время от времени, возможно, в качестве комментариев (поскольку они, конечно, не являются частью языка)   -  person Jonathan    schedule 03.06.2011
comment
Аргументы функции являются общими и типизированными, что вы ожидаете, что она вернет?   -  person Cat Plus Plus    schedule 24.07.2011
comment
@delnan - я подозреваю, что объявление переменных - скорее недостаток. Кто-нибудь проводил исследование по этому вопросу, чтобы определить, действительно ли усилия экономятся, если не объявлять переменные? Я видел так много ошибок в языках без объявлений. (Кстати, объявление переменных не делает язык менее динамичным. Даже в Javascript есть var!)   -  person Chris    schedule 22.10.2015


Ответы (5)


[Изменить]

Начиная с PyDev 2.8.0, он может использовать строки документации и комментарии для определения типа объектов.

Подробнее о поддерживаемых форматах см. на странице http://pydev.org/manual_adv_type_hints.html.

[До PyDev 2.8.0]

Раньше он поддерживал только вызовы assert isinstance (и это все еще работает):

assert isinstance(a_list, list)

PyDev сможет распознать его и должным образом обеспечить завершение кода для него (обратите внимание, что вы можете запустить Python без утверждений позже, если обнаружите, что ваш код замедляется: Что делает оптимизация Python (-O или PYTHONOPTIMIZE)? )

person Fabio Zadrozny    schedule 22.08.2011
comment
Это немного менее элегантно, чем украшение или комментарий, так как это может фактически привести к сбою вашей программы, если a_list на самом деле не является list. Я все еще хотел бы, чтобы PIP элегантно решал эту проблему в будущем... - person Jonathan; 28.09.2011
comment
Технически вы правы, но это не работает между вызовами функций и, следовательно, не очень полезно. Этот ответ неплохой, но я не думаю, что он отвечает на вопрос. - person Mechanical snail; 20.10.2011
comment
Я буду следить за другими ответами, поэтому, если у кого-то есть другие идеи, продолжайте и опубликуйте их. - person Jonathan; 20.10.2011
comment
@Jonathan Я думаю, что в большинстве случаев это хорошо, если программа приводит к сбою, потому что это означает, что исходное предположение о ее типе времени выполнения было неверным, что в любом случае могло привести к более серьезным ошибкам (см. Fail-fast в Википедии). Обратите внимание, что PyDev достаточно умен, чтобы понимать isinstance с несколькими типами, поэтому, если вы знаете, что это может быть несколько типов в типе дизайна, вы должны включить эти типы, чтобы ваша программа никогда не давала сбоев, если переменные имеют ожидаемые типы. Пример: используйте assert isinstance(my_var, (int, str)), если вы знаете, что это может быть либо int, либо str. - person user193130; 29.01.2014
comment
@Fabio: поддерживает ли PyDev какой-то список типа x. например, в PyCharm? jetbrains.com/pycharm/webhelp/ Есть ли планы по его поддержке, если еще нет? - person Zoran Pavlovic; 13.10.2014
comment
Планы есть, но пока не поддерживаются. - person Fabio Zadrozny; 14.10.2014

Начиная с PyDev 2.8.0, для завершения кода можно использовать комментарии Sphinx или Epydoc: http://pydev.org/manual_adv_type_hints.html

person eakst7    schedule 16.09.2013

Если вы используете PyCharm, вы можете выбрать стиль строки документации epydoc или sphinx и указать типы параметров и возврата функции. значения в соответствии с этим стилем (дальнейшее обсуждение)

person Jonathan    schedule 21.08.2012
comment
Обратите внимание, что начиная с PyDev 2.8.0, строки документации epidoc или sphinx также поддерживаются в PyDev. - person Fabio Zadrozny; 17.09.2013

Что я обычно делаю, чтобы обойти это.

def func(my_list_param):
    my_list_param = []
    my_list_param.appe # at this stage I would get code completion.

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

person Zoran Pavlovic    schedule 14.11.2012
comment
Этот метод имеет слишком много недостатков, например. вы не можете оставить это в коде для будущего редактирования, вы обязаны забыть эти строки в коде перед фиксацией... - person Jonathan; 14.11.2012

Если вы используете Python >= 3.5 в своем коде, вы можете указать тип параметров в объявлениях функций (26.1. ввод — поддержка подсказок типа), поэтому ваш код может быть:

from someobj import SomeObject

def some_func(a_list: list, an_object: SomeObject):
    a_list.app           # Code completion works
    an_object.a_method() # Code completion works

Этот тип синтаксиса не влияет на выполнение и не проверяет реальный тип, переданный функции, но делает ваш код более читабельным и заставляет работать автодополнение кода.

person Zompa    schedule 19.08.2019