PyCharm 中类型提示 dict.items() 时的奇怪行为

Strange behaviour when type-hinting dict.items() in PyCharm

假设我有一个函数,do_something:

from typing import Sequence, Tuple, Dict

def do_something(argument: Sequence[Tuple[int, str]]):
    pass

假设我还有一个字典,D,它的键只有 ints,它的值只有 strs:

D: Dict[int, str] = {1: 'a', 2: 'b', 3: 'c'}

在 PyCharm 中,这将以优异的成绩通过类型检查器:

do_something(
    ((1, 'a'), (2, 'b'), (3, 'c'))
)

但是,根据 PyCharm,尽管生成的内容相同,但类型检查器未通过:

do_something(tuple(D.items()))

这是预期的行为吗——我是不是漏掉了什么? -- 或者这是 PyCharm 类型检查器的错误?

PyCharm 不能保证 D 的类型真的是 Dict[str, int];它可能不进行代码流分析以确保没有任何东西不能将非 (str, int) 对添加到字典中。 (顺便说一句,您应该看看 Python 的“规范”类型检查器 Mypy 是否可以。)

您可以添加显式类型注释以查看是否有帮助。

D: Dict[str, int] = {1: 'a', 2: 'b', 3: 'c'}

这是 PyCharm 中的错误。 有许多类似的错误,例如this, this, this.

总的来说,PyCharm在这方面非常聪明。在您的案例中,它正确地推断出 D 的类型。它还正确地推断出 D.items(),然后在像 for k, v in D.items()kv 这样的代码中将被正确地推断出来。但是由于某些奇怪的原因,tuple/list/sortedD.items() 附近的某物有问题。

我总是会在 Youtrack 上报告问题,而您认为它应该有效。