Как указать тип переменной, тип которой является любым подклассом универсального базового класса?Python

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

Сообщение Anonymous »

У меня есть два абстрактных базовых класса, которые связаны между собой и должны быть разделены на подклассы. В качестве минимального примера предположим, что это некоторый класс TobeProcessed и другой класс Processor, который выполняет некоторую обработку экземпляров класса TobeProcessed. Я создал процессор Generic с типом класса TobeProcessed в качестве аргумента типа.

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

from abc import ABC, abstractmethod
from typing import Generic, TypeVar

class TobeProcessed(ABC):
pass

TobeProcessedType = TypeVar("TobeProcessedType", bound=TobeProcessed)

class Processor(ABC, Generic[TobeProcessedType]):
@abstractmethod
def process(self, to_be_processed: TobeProcessedType) -> None:
pass
Теперь у меня есть конкретные реализации обоих классов:

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

class TobeProcessedConcrete(TobeProcessed):
pass

class ProcessorConcrete(Processor[TobeProcessedConcrete]):
def process(self, to_be_processed: TobeProcessedConcrete) -> None:
return None
Наконец, у меня есть класс-оболочка с процессором атрибутов, который является экземпляром любого подкласса класса Processor.

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

class WrapperClass:
processor: Processor

def __init__(self, processor: Processor) -> None:
self.processor = processor

processor = ProcessorConcrete()
wrapper = WrapperClass(processor=processor)
Если я проверю это с помощью mypy с --disallow-any-generics (или --strict), я получу две ошибки для WrapperClass , потому что я опустил параметр типа для процессора, что имеет смысл. Однако если я заменю Processor на Processor[TobeProcessed], я получу ошибку для оболочки строки = WrapperClass(processor=processor):

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

Argument "processor" to "WrapperClass" has incompatible type "ProcessorConcrete"; expected "Processor[TobeProcessed]"
.
Есть ли способ сделать это без ошибок и не делая mypy менее строгим?

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

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

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

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

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

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

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