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. Для интерпретатора все ваши объявления не имеют никакого значения, т.к. в любой список всегда можно положить все что угодно. Даже ваш генератор это не обозначение типа, как вы почему-то думаете, а просто заполнение списка объектами класса. Ничего не мешает потом любой элемент заменить числом, строкой, объектом другого класса и т.д.

→ Ссылка
Автор решения: CrazyElf

Питон - язык с динамической типизацией. Кроме того, в питоновском списке могут быть вперемешку элементы любых типов. Поэтому объявлять заранее ничего не нужно, питон автоматически увидит поля класса, когда вы к ним обратитесь.

→ Ссылка
Автор решения: Andrey Maslov

Последние версии питона поддерживают тайпхинты https://docs.python.org/3/library/typing.html В итоге Ваше объявление можно сделать таким

from typing import List
obj: List[obj_property] = []

Но надо понимать, что это никак не ограничивает возможность занести в этот лист какой-то другой элемент.

Так же рекомендую все таки придерживаться PEP-8 при нейминге и переименовать класс в ObjProperty

→ Ссылка