Проблема с отсутствием автозаполнения / приведения в Python

У меня есть ситуация, когда в первом классе я объявляю массив и передаю его другому объекту, который печатает имена элементов в этом массиве. Это работает, но когда я ввожу "автомобиль". в ReadCarNames ide не предлагает мне "имя"? Я пробую это в wing ide 4 pro. Могу ли я завести автомобиль в методе ReadCarNames?

########################################################################
class MyClass:
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        cars=[]
        cars.append(Car('bmw'))
        cars.append(Car('audi'))
        reader=Reader()
        reader.ReadCarNames(cars)

########################################################################
class Car:
    """"""

    #----------------------------------------------------------------------
    def __init__(self,name):
        self.name=name



########################################################################
class Reader:
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
    def ReadCarNames(self,cars):
        for counter,car in enumerate(cars):

            print str(counter) +' '+ car.name

4 ответа

Решение

Смотрите здесь: http://www.wingware.com/doc/edit/helping-wing-analyze-code

Ваша IDE (Wing) не знает наверняка, какой тип объектов находится в cars, но вы можете сказать, что car с утверждением assert, и оно выполнит автозаполнение именно так, как вы хотите. Вы можете рассматривать это как наложение типа для глаз Крыла, только если вам нравится.

class Reader:
    def __init__(self):
        """Constructor"""
    def ReadCarNames(self,cars):
        for counter,car in enumerate(cars):
            assert isinstance(car, Car)        # this trains Wing
            print str(counter) +' '+ car.name  # autocompletion will work here

или если вы не хотите, чтобы это утверждение срабатывало постоянно, вы можете заключить его в логику "если 0", которую Wing's SourceAssistant получает, но python не будет выполняться.

if 0: assert isinstance(car, Car)

В настоящее время вы не можете сказать Wing, что список / кортеж / etc содержит только один тип объекта и что это такое, но он входит в их планы и будет использовать аналогичный синтаксис.

Хороший способ работы в Wing IDE - это установить точку останова, выполнить ее, а затем вы получите анализ во время выполнения в редакторе (в коде, который находится в активном стеке отладки) и Debug Probe. Это показано на экране "Статический анализ и анализ времени выполнения", второй с последнего на http://wingware.com/wingide/code-intelligence

Среда IDE не знает тип, возвращаемый из перечисления, и поэтому не может выполнить автозаполнение в этой ситуации. Он также не знает, что cars список содержит Car,

Из-за динамической природы Python невозможно определить тип экземпляра или даже какие у него атрибуты без запуска кода. Например, ваш Car экземпляры не имеют name атрибут, пока они не будут созданы, так что даже если IDE каким-то образом знал, что car был Car Например, у него был бы черт времени, выясняющий, какие атрибуты он будет иметь статически.

Это зависит от вашей IDE, но некоторые IDE (такие как IDLE, поставляемая с Python) дадут лучшие результаты после запуска вашего скрипта. В этом случае, хотя, вероятно, нет.

Другие вопросы по тегам