Здесь я пробую универсальный класс, который наследуется от абстрактного базового класса Sequence (и ABC — это необходимо?) . Затем я создаю дочерние классы, в которых эта последовательность представляет собой список или кортеж. Пайланс этим доволен, и все работает нормально:
Код: Выделить всё
from __future__ import annotations
from abc import ABC
from collections.abc import Iterable, Sequence
class Row[T](Sequence[T], ABC):
def __init__(self, iterable: Iterable[T]):
...
class Row_Mutable[T](list[T], Row[T]):
def __init__(self, iterable):
super().__init__(iterable)
class Row_Immutable[T](tuple[T], Row[T]):
def __init__(self, iterable):
super().__init__(iterable)
row_mut_int: Row_Mutable[int] = Row_Mutable(range(10))
row_mut_str: Row_Mutable[str] = Row_Mutable('abcdefg')
row_imm_int: Row_Immutable[int] = Row_Immutable(range(10))
row_imm_str: Row_Immutable[str] = Row_Immutable('abcdefg')
Код: Выделить всё
class Grid[T](Sequence[Sequence[T]], ABC):
def __init__(self, iterable: Iterable[Iterable[T]]):
...
class Grid_Mutable[T](list[list[T]], Grid[T]):
def __init__(self, iter_of_iter):
super().__init__(list(row) for row in iter_of_iter)
class Grid_Immutable[T](tuple[tuple[T]], Grid[T]):
def __init__(self, iter_of_iter):
super().__init__(tuple(row) for row in iter_of_iter)
Код: Выделить всё
Base classes of Grid_Mutable are mutually incompatible
Base class "Grid[T@Grid_Mutable]" derives from "Sequence[Sequence[T@Grid_Mutable]]" which is incompatible with type "Sequence[list[T@Grid_Mutable]]"
Как Sequence[Sequence[T]] несовместим с Sequence[ список[T]]? Как должен мне написать код и намекнуть на что-то подобное?
Copilot предложил форму T = TypeVar('T') вместо Grid[T] ; это немного изменило ошибки, но не устранило их. Я использую Python 3.13, и меня не беспокоит обратная совместимость — больше о лучших практиках и Pythonicness.
Подробнее здесь: https://stackoverflow.com/questions/793 ... incompatib