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

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

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

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

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

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

UPDATE:
Возможно, для разъяснения есть пример:

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

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

4b9b3361

Ответ 1

[изменить]

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

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

[До PyDev 2.8.0]

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

assert isinstance(a_list, list)

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Если вы используете 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

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