Подкласс подсказки типа, который содержит ссылки на другие экземпляры своего собственного типа.Python

Программы на Python
Anonymous
Подкласс подсказки типа, который содержит ссылки на другие экземпляры своего собственного типа.

Сообщение Anonymous »

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

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

class LinkedList2D:
up: Optional[LinkedList2D]
down: Optional[LinkedList2D]
before: Optional[LinkedList2D]
after: Optional[LinkedList2D]

def __init__(self) -> None:
self.up = None
self.down = None
self.before = None
self.after = None

def iterate_children(self) -> Generator[LinkedList2D, None, None]:
link = self.down

while link:
yield link

link = link.after

def iterate_tree(self) -> Generator[LinkedList2D, None, None]:
for child in self.iterate_children():
if child:
yield child

yield from child.iterate_children()

def get_children(self) -> List[LinkedList2D]:
return list(self.iterate_children())

def insert_under(self, op: LinkedList2D) -> bool:
if op:
if op.down:
self.insert_before(op.down)

op.down = self

self.up = op

return True

def insert_under_last(self, op: LinkedList2D) -> bool:
self.up = op

if op:
if op.down:
last = self.get_children()[-1]

self.insert_after(last)
else:
op.down = self

return True

def insert_after(self, obj: LinkedList2D) -> bool:
if obj:
if obj.after:
obj.after.before = self

obj.after = self

self.after = obj.after

self.up = obj.up

self.before = obj

return True

def insert_before(self, obj: LinkedList2D) -> bool:
if obj:
if obj.before:
obj.before.after = self

obj.before = self

self.up = obj.up

self.before = obj.before

self.after = obj

return True
Я думаю, что общая версия будет выглядеть так. Я использовал bound, чтобы убедиться, что потенциальные экземпляры являются подклассами LinkedList2D и реализуют необходимые функции и атрибуты.

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

T = TypeVar("T", bound="LinkedList2D")

class LinkedList2D(Generic[T]):
up: Optional[T]
down: Optional[T]
before: Optional[T]
after: Optional[T]

def __init__(self) -> None:
...

def iterate_children(self) -> Generator[T, None, None]:
...

def iterate_tree(self) -> Generator[T, None, None]:
...

def get_children(self) -> List[T]:
...

def insert_under(self, op: T) -> bool:
if op:
if op.down:
self.insert_before(op.down)

op.down = self

self.up = op

return True

def insert_under_last(self, op: T) -> bool:
...

def insert_before(self, obj: T) -> bool:
...
Проблема в том, что теперь pylance жалуется на строку op.down = self в методе insert_under:

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

Cannot assign member "down" for type "LinkedList2D[T@LinkedList2D]"
Expression of type "LinkedList2D[T@LinkedList2D]" cannot be assigned to member "down" of class "LinkedList2D[T@LinkedList2D]"
Type "LinkedList2D[T@LinkedList2D]" cannot be assigned to type "T@LinkedList2D | None"
Type "LinkedList2D[T@LinkedList2D]" cannot be assigned to type "T@LinkedList2D"
Cannot assign to "None"PylancereportGeneralTypeIssues
Любые идеи и подсказки приветствуются. Спасибо


Подробнее здесь: https://stackoverflow.com/questions/673 ... its-own-ty

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