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]()
Другие вопросы по тегам