Обеспечение безопасности типов между конкретными подклассами абстрактного базового класса в PythonPython

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

Сообщение Anonymous »

В моем проекте Python я столкнулся с проблемой безопасности типов, связанной с абстрактным базовым классом (AbstractClass) и его конкретными подклассами (ConcreteClassA и ConcreteClassB). Каждый конкретный класс реализует абстрактные методы из AbstractClass, но я изо всех сил пытаюсь обеспечить безопасность типов между двумя конкретными классами.
Вот упрощенная версия моей структуры кода:

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

class AbstractClass(ABC):
class rational:
pass

@dataclass
class Frac(rational):
value1: int
value2: int

@dataclass
class Whole(rational):
value: int

@classmethod
@abstractmethod
def foo(cls, x: int, y: int) -> rational:
pass

@classmethod
@abstractmethod
def boo(cls, r: rational) -> str:
pass

class ConcreteClassA(AbstractClass):
@classmethod
def foo(cls, x: int, y: int) -> AbstractClass.rational:
...

@classmethod
def boo(cls, r: AbstractClass.rational) -> str:
...

class ConcreteClassB(AbstractClass):
@classmethod
def foo(cls, x: int, y: int) -> AbstractClass.rational:
...

@classmethod
def boo(cls, r: AbstractClass.rational) -> str:
...

a = ConcreteClassA.boo(ConcreteClassB.foo(9, -6))
b = ConcreteClassB.boo(ConcreteClassA.foo(9, -6))
Несмотря на структуру, между ConcreteClassA и ConcreteClassB не обеспечивается безопасность типов. Например, вызовы типа ConcreteClassA.foo с аргументами ConcreteClassB.boo не приводят к какой-либо ошибке, что нежелательно.
Я использую Pyright для проверки типов. Как я могу изменить свой код, чтобы гарантировать возникновение ошибок при передаче данных между ConcreteClassA и ConcreteClassB? Обратите внимание: я предпочитаю не добавлять дженерики, псевдонимы типов или другие конструкции непосредственно в основной класс. Будем признательны за любые предложения и идеи!
А также реализацию @dataclss внутри AbstractClass, просто используйте ее.

(Цели обучения)

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

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

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

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

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

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

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