Подкласс подсказки типа, который содержит ссылки на другие экземпляры своего собственного типа.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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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