Введите список подсказок дочерних классов, если исходный список имеет родительский тип в Python [дубликат]Python

Программы на Python
Anonymous
Введите список подсказок дочерних классов, если исходный список имеет родительский тип в Python [дубликат]

Сообщение Anonymous »

Для переменной со списком подсказок типа[ParentItem], как можно присвоить ей другой список со списком подсказок типа[ChildItem], где ChildItem является производным от ParentItem , не вызывая ошибок проверки типа линтера?
Рассмотрим следующий надуманный минимальный пример, в котором линтер Pyright выдает следующую ошибку проверки типа аргумента:

Аргумент типа list[ChildItem] не может быть назначен элементам параметра типа list[ParentItem] в функции __init__

Код: Выделить всё

list[ChildItem]
несовместим со списком[ParentItem] Параметр типа _T@list является инвариантным, но ChildItem не совпадает с ParentItem Рассмотрите возможность перехода со списка > к последовательности, которая является ковариантной

Код: Выделить всё

class ParentItem:
def __init__(self) -> None:
pass

class ChildItem(ParentItem):
def __init__(self) -> None:
super().__init__()

class ParentGroup:
def __init__(self, items: list[ParentItem]) -> None:
self._items = items

def add(self, item: ParentItem) -> None:
self._items.append(item)

class ChildGroup(ParentGroup):
def __init__(self, child_items: list[ChildItem]) -> None:
super().__init__(child_items)  # pyright argument type checking error here
Изменение строки:

Код: Выделить всё

    def __init__(self, child_items: list[ChildItem]) -> None:
для

Код: Выделить всё

    def __init__(self, child_items: list[ParentItem]) -> None:
на первый взгляд устраняет ошибку, но не дает нужных подсказок по типу при использовании класса ChildGroup. В любом случае ошибка снова появляется позже, когда кто-то пытается создать экземпляр ChildGroup, используя список экземпляров ChildItem, например:

Код: Выделить всё

i1 = ChildItem()
i2 = ChildItem()
ilist = [i1, i2]
g_with_child_items = ChildGroup(ilist) # same error as before, but regarding assignment to "child_items" parameter instead of "items" parameter
Как можно правильно указать переменную child_items класса ChildGroup, аннотированную как list[ChildItem]?

Подробнее здесь: https://stackoverflow.com/questions/788 ... arents-typ

Вернуться в «Python»