Python. Как объявить тип элементов в пустом списке, что-бы отображались подсказки свойств этого типа в PyCharm?
Столкнулся с проблемой, которая наверняка очень просто решается, но... сам не понимаю. Среда разработки - PyCharm. Объявляю пустой список, элементы в него будут добавляться динамически пользователем приложения. В процессе кодинга в PyCharm подсказки не появляются, так как элемента в списке еще не существует и его тип неизвестен по определению.
obj = list()
У меня есть некий класс:
class obj_property:
obj_name = ''
obj_img_path = ''
obj_posX = 0
obj_posY = 0
Каким образом можно дать знать IDE, что в списке будут элементы типа obj_property. Что-бы впоследствии они имели подсказки вида:
obj[1].obj_name
obj[i].obj_posX
Через генератор списка я могу обозначить тип:
obj = [obj_property(None) for i in range(5000)]
Возможно ли сделать то же самое без использования генератора? Так как количество будущих элементов в списке неизвестно.
Ответы (3 шт):
Объявить кому? Другим программистам, которые будут читать код? Напишите в комментариях или type hints. Для интерпретатора все ваши объявления не имеют никакого значения, т.к. в любой список всегда можно положить все что угодно. Даже ваш генератор это не обозначение типа, как вы почему-то думаете, а просто заполнение списка объектами класса. Ничего не мешает потом любой элемент заменить числом, строкой, объектом другого класса и т.д.
Питон - язык с динамической типизацией. Кроме того, в питоновском списке могут быть вперемешку элементы любых типов. Поэтому объявлять заранее ничего не нужно, питон автоматически увидит поля класса, когда вы к ним обратитесь.
Последние версии питона поддерживают тайпхинты https://docs.python.org/3/library/typing.html В итоге Ваше объявление можно сделать таким
from typing import List
obj: List[obj_property] = []
Но надо понимать, что это никак не ограничивает возможность занести в этот лист какой-то другой элемент.
Так же рекомендую все таки придерживаться PEP-8 при нейминге и переименовать класс в ObjProperty