mypy
version 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]]
,这是一个将字符串映射到字符串集合的字典。这是因为对于您的字典,您使用了str
和dict[str, int]
作为值,我只能推测typing.Collection[str]
是包含str
和dict[str, str]
的最不广泛的类型。我真的不确定mymyy应该如何处理像你这样嵌套的字典字面量的推理。
注意,仅用dict
注释意味着它将使用dict[Any, Any]
,这可能是您不想要的。您应该尝试给出一个更受约束的类型,但这取决于您打算如何使用d
。