为什么myy很难赋值给嵌套字典?



mypyversion 0.910

考虑
d = {
'a': 'a',
'b': {
'c': 1
}
}
d['b']['d'] = 'b'

将此输入mypy,结果为

error: Unsupported target for indexed assignment ("Collection[str]")

mypy推断为d的错误类型(它显然不是字符串集合)的一边,为d添加一个非常基本的显式类型修复此:

d: dict = {
... # same as above
}

Success: no issues found in 1 source file

我觉得这很奇怪。mypy肯定能够推断出d是一个没有d: dict的字典。

d没有被推断为字符串集合。它被推断为dict,但是字典有两个类型变量,一个用于键,另一个用于值。如果我们使用reveal_type:

d = {
'a': 'a',
'b': {
'c': 1
}
}
reveal_type(d)
d['b']['d'] = 'b'

我:

(py39) jarrivillaga-mbp16-2019:~ jarrivillaga$ mypy --version
mypy 0.910
(py39) jarrivillaga-mbp16-2019:~ jarrivillaga$ mypy scratch.py
scratch.py:7: note: Revealed type is "builtins.dict[builtins.str*, typing.Collection*[builtins.str]]"
scratch.py:8: error: Unsupported target for indexed assignment ("Collection[str]")
Found 1 error in 1 file (checked 1 source file)

因此,它被推断为:builtins.dict[builtins.str*, typing.Collection*[builtins.str]],这是一个将字符串映射到字符串集合的字典。这是因为对于您的字典,您使用了strdict[str, int]作为值,我只能推测typing.Collection[str]是包含strdict[str, str]的最不广泛的类型。我真的不确定mymyy应该如何处理像你这样嵌套的字典字面量的推理。

注意,仅用dict注释意味着它将使用dict[Any, Any],这可能是您不想要的。您应该尝试给出一个更受约束的类型,但这取决于您打算如何使用d

最新更新