Как указать тип переменной, тип которой является любым подклассом универсального базового класса?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

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