Mypy:我应该如何输入一个以字符串为键且值可以是字符串或字符串列表的字典?

问题描述 投票:0回答:1

我正在使用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 在评论中建议。

python python-typing mypy
1个回答
17
投票

因为

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或更高版本(其中

TypedDict
在标准库打字模块中可用),否则您需要使用pip安装typing_extensions才能使用TypedDict


当然,您可以使用

Any

Mytype = Dict[str, Any]
© www.soinside.com 2019 - 2024. All rights reserved.