Наследование типов Python «Базовые классы [child] взаимно несовместимы»Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Наследование типов Python «Базовые классы [child] взаимно несовместимы»

Сообщение Anonymous »

Я пытаюсь научиться использовать базовые классы и наследование. Я получаю ошибки проверки типов, но код работает как положено. Есть ли у меня проблемы с проверкой типов, проблемы с подсказками типов или значимые проблемы с кодом?
Здесь я пробую универсальный класс, который наследуется от абстрактного базового класса 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')
Теперь 2D-версия. Это последовательность последовательностей, поэтому дочерними элементами являются списки списков и кортеж кортежей:

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

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)
Теперь Pylance вызывает определения классов:

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

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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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