Я использую Python 3.8.1 и mypy 0.782. Я не понимаю, почему mypy жалуется на следующий код:
from typing import Union, List, Dict
Mytype = Union[Dict[str, str], Dict[str, List[str]]]
s: Mytype = {"x": "y", "a": ["b"]}
Mypy выдает следующую ошибку в строке 3:
Incompatible types in assignment (expression has type "Dict[str, Sequence[str]]", variable has type "Union[Dict[str, str], Dict[str, List[str]]]")
Если я изменю последнюю строку на s: Mytype = {"a": ["b"]}
mypy не жалуется. Однако при добавлении еще одной строки s["a"].append("c")
приводит к ошибке:
error: Item "str" of "Union[str, List[str]]" has no attribute "append"
Чем объяснить вышесказанное? Как мне ввести dict, в котором в качестве ключей используются строки, а значения могут быть строками или списками строк?
Нашел это: https://github.com/python/mypy/issues/2984#issuecomment -285716826 , но все еще не совсем уверен, почему вышеупомянутое происходит, и как мне это исправить.
EDIT: Хотя до сих пор не ясно, почему предлагаемая модификация Mytype = Dict[str, Union[str, List[str]]]
не устраняет ошибку с помощью s['a'].append('c')
Я думаю, что подход TypeDict предложенный в комментариях, а также в { ссылка } - это путь к go, поэтому отметьте этот подход как решение.
См. аналогичный вопрос по адресу: Указание нескольких значений в Dict [] для подсказок типа , предложенных в комментариях Георгия.