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
,它的键只有 int
s,它的值只有 str
s:
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()
、k
和 v
这样的代码中将被正确地推断出来。但是由于某些奇怪的原因,tuple
/list
/sorted
或 D.items()
附近的某物有问题。
我总是会在 Youtrack 上报告问题,而您认为它应该有效。
假设我有一个函数,do_something
:
from typing import Sequence, Tuple, Dict
def do_something(argument: Sequence[Tuple[int, str]]):
pass
假设我还有一个字典,D
,它的键只有 int
s,它的值只有 str
s:
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()
、k
和 v
这样的代码中将被正确地推断出来。但是由于某些奇怪的原因,tuple
/list
/sorted
或 D.items()
附近的某物有问题。
我总是会在 Youtrack 上报告问题,而您认为它应该有效。