Python PyCharm中带有类型暗示的奇怪行为
假设我有一个函数,做点什么:Python PyCharm中带有类型暗示的奇怪行为,python,python-3.x,pycharm,python-typing,Python,Python 3.x,Pycharm,Python Typing,假设我有一个函数,做点什么: from typing import * def do_something(argument: Sequence[Tuple[int, str]]): pass 假设我还有一个字典D,它的键都是int,值都是字符串: D = {1: 'a', 2: 'b', 3: 'c'} 在PyCharm中,这将以优异的成绩通过类型检查器: do_something( ((1, 'a'), (2, 'b'), (3, 'c')) ) 但是,根据PyChar
from typing import *
def do_something(argument: Sequence[Tuple[int, str]]):
pass
假设我还有一个字典D,它的键都是int,值都是字符串:
D = {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)
对添加到dict中(顺便说一句,您应该看看Python的“规范”类型检查器Mypy是否可以)
您可以添加显式类型注释,看看这是否有帮助
D: Dict[str, int] = {1: 'a', 2: 'b', 3: 'c'}
这是PyCharm中的一个bug。
有许多类似的bug,例如
总的来说,PyCharm在这方面相当聪明。它正确地推断出您案例中的D
类型。它还正确地推断出D.items()
,然后在类似的代码中为k,v在D.items()
中,将正确地推断出k
和v
。但出于某种奇怪的原因,元组
/列表
/排序
或D.items()
周围的东西有问题
我总是会报告一个问题,告诉你什么时候它会起作用。这很有道理,谢谢。是的--我尝试显式地指定字典的键和值始终是一致的类型。不幸的是,没有做任何事(虽然这显然不是一个大问题)。如果添加显式类型没有帮助,那么对于
x
即Dict[K,V]
是一个Sequence[tuple[K,V]]
,可能没有隐式或显式类型表示tuple(x.items())
。是的,我认为这是一个更深层次的问题。我尝试将函数本身中的类型提示调整为:def DoSomething(参数:Sequence[Tuple[Any,Any]]):pass
,但问题仍然存在。无论给定字典的键和值的类型是什么,在我看来,tuple(Dict.items())的类型始终是Sequence[tuple[any,any]]。所以这对我来说没有逻辑意义。嗯。。。试试Iterable[Tuple[K,V]]
-我认为序列应该是可索引的,但是.items()
es肯定不是。仍然是否定的!从我在另一个答案中提到的例子来看,它看起来可能只是一个PyCharm bug。我仍然很想知道Mypy是否适合这个问题。