Союз протоколов с инвариантным общим типом вызывает проблемыPython

Программы на Python
Anonymous
 Союз протоколов с инвариантным общим типом вызывает проблемы

Сообщение Anonymous »

У меня есть протокол myexporter с использованием общего типа t :

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

T = TypeVar("T", bound=BaseSample)

class MyExporter(Protocol[T]):
def get_sample(self) -> T:
...

def process_sample(self, sample: T) -> str:
...
У меня также есть функция, которая, учитывая строку, возвращает модуль, реализующий myexporter с t установить на один из двух возможных базовых образцов подклассов , Samplea или sampleb :

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

def get_exporter(name: str) -> Union[MyExporter[SampleA], MyExporter[SampleB]]:
if name == "a":
return my_exporter_a
return my_exporter_b

Моя проблема в том, когда я использую myexporter нравится это:

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

exporter = get_exporter("a")
sample = exporter.get_sample()
output = exporter.process_sample(sample) # type checker complains here
< /code>
Я получаю следующие ошибки от Mypy: < /p>
Argument 1 to "process_sample" of "MyExporter" has incompatible type "Union[SampleA, SampleB]"; expected "SampleA"
Argument 1 to "process_sample" of "MyExporter" has incompatible type "Union[SampleA, SampleB]"; expected "SampleB"
Имеет смысл, что пример имеет тип Samplea | SampleB , но я также чувствую, что проверка типа должна быть в состоянии сделать вывод, что вывод GET_SAMPLE является допустимым аргументом для Process_sample при использовании одного и того же экспортера.
Есть ли какой -нибудь способ, который не требует архитектурного пересмотра?

Подробнее здесь: https://stackoverflow.com/questions/779 ... s-problems

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