我正在使用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"
上述如何解释?我应该如何输入一个以字符串为键且值可以是字符串或字符串列表的字典?
发现这个:https://github.com/python/mypy/issues/2984#issuecomment-285716826但仍然不完全确定为什么会发生上述情况以及我应该如何解决它。
编辑: 虽然还不清楚为什么建议的修改
Mytype = Dict[str, Union[str, List[str]]]
无法解决 s['a'].append('c')
的错误,但我认为评论中以及 https://stackoverflow.com/a/62862029/692695 中建议的 TypeDict 方法是要走的路,所以将该方法标记为解决方案。
请参阅类似的问题:Indicating multiple value in a Dict[] for typehins,Georgy 在评论中建议。
因为
s: Mytype
不能同时具有类型Dict[str, str]
和类型Dict[str, List[str]]
。你可以像这样做你想做的事:
Mytype = Dict[str, Union[str, List[str]]]
但也许有问题,因为
Dict
是不变的
TypedDict
,但只需要一组固定的字符串键:
from typing import List, TypedDict
MyType = TypedDict('MyType', {'x': str, 'a': List[str]})
s: MyType = {"x": "y", "a": ["b"]}
s['a'].append('c')
注意:
除非您使用的是Python 3.8或更高版本(其中
在标准库打字模块中可用),否则您需要使用pip安装typing_extensions才能使用TypedDictTypedDict
当然,您可以使用
Any
:
Mytype = Dict[str, Any]