Mypy: несовместимый тип (объект) со словарем функций
Следующий код:
from typing import Union
def a() -> int:
return 1
def b() -> str:
return 'a'
def c(arg: str = 'a') -> Union[int, str]:
return {'a': a, 'b': b}[arg]()
запускает следующее исключение mypy:
error: Incompatible return value type (got "object", expected "Union[int, str]")
Обходной путь будет использовать:
return a() if arg == 'a' else b()
в этом случае Mypy не жалуется, но словарный синтаксис все еще полезен, если имеется более 2 функций. Есть ли способ обойти это, или это ошибка Mypy?
1 ответ
Решение
Я думаю, проблема в том, что вы не объявляете разрешенные типы словаря. Хотя в вашем коде ясно, что в словаре есть только два типа вывода, с точки зрения типизации нет ничего, что могло бы остановить другую функцию d()
быть добавленным к этому.
Вы можете попробовать следующее, чтобы обойти эту проблему:
from typing import Union, Dict, Callable
output_dictionary : Dict[str, Union[Callable[[], int],Callable[[], str]]] = {'a': a, 'b': b}
def c(arg: str = 'a') -> Union[int, str]:
return output_dictionary[arg]()