Ошибка ввода с унаследованными классами, имеющими перегруженный конструктор с разными параметрами.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка ввода с унаследованными классами, имеющими перегруженный конструктор с разными параметрами.

Сообщение Anonymous »

С помощью приведенного ниже кода:

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

import abc

class ABCParent(metaclass=abc.ABCMeta):
def __init__(self, a: str, sibling_type: type[ABCParent]) -> None:
self.a = a
self._sibling_type = sibling_type
def new_sibling(self, a: str) -> ABCParent:
return self._sibling_type(a)

class ChildA(ABCParent):
def __init__(self, a: str) -> None:
super().__init__(a, ChildB)

class ChildB(ABCParent):
def __init__(self, a: str) -> None:
super().__init__(a, ChildA)
При использовании mypy в строгом режиме я получаю следующую ошибку ввода.

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

src/demo_problem.py: note: In member "new_sibling" of class "ABCParent":
src/demo_problem.py:10:16:10:36: error: Missing positional argument "sibling_type" in call to "ABCParent"  [call-arg]
return self._sibling_type(a)
Это совершенно логично, поскольку ABCParent запрашивает аргумент sibling_type. Но в моем случае self._sibling_type будет одним из дочерних классов, который переопределяет конструктор, поэтому sibling_type не нужен.
Мне удалось чтобы обойти проблему, используя typing.Union дочерних классов:

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

import abc
import typing

TConcreteChild: typing.TypeAlias = typing.Union["ChildA", "ChildB"]

class ABCParent(metaclass=abc.ABCMeta):
def __init__(self, a: str, sibling_type: type[TConcreteChild]) -> None:
...
Но мне это не нравится, потому что:
  • Это предполагает определение псевдонима типа (

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

    TConcreteChild
    ), что в противном случае бесполезно.
  • Определение этого псевдонима необходимо обновить, если определено больше дочерних классов.
  • Это предполагает определение типов до определения классов, поэтому требуются прямые ссылки с использованием строк (и, следовательно, он не может использовать новый синтаксис ChildA | ChildB).
Как мне сделать это более аккуратно, сохраняя при этом строгую проверку типов?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -different
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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