Проблема с отсутствием автозаполнения / приведения в Python - PullRequest
1 голос
/ 28 февраля 2011

У меня есть ситуация, когда в первом классе я объявляю массив и передаю его другому объекту, который печатает имена элементов в этом массиве.Это работает, но когда я ввожу «автомобиль».в 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 ]

3 голосов
/ 28 февраля 2011

Смотрите здесь: 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», которую подхватывает SourceAssistant Wing, но python не будет выполняться.

if 0: assert isinstance(car, Car)

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

2 голосов
/ 09 февраля 2012

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

1 голос
/ 28 февраля 2011

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

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

1 голос
/ 28 февраля 2011

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

...