Проблема с отсутствием автозаполнения / приведения в 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) дадут лучшие результаты после запуска вашего скрипта. В этом случае, хотя, вероятно, нет.