PyCharm无法识别字典值类型

时间:2016-05-03 17:41:58

标签: python list dictionary pycharm type-hinting

我有一个简单的代码片段,我将字典值设置为空列表:

new_dict[i]

现在,如果在下一行的循环内我输入list并添加一个点,我希望PyCharm向我展示一个可用于new_dict的方法列表,但是PyCharm无法识别这个简单案例中的字典值类型:

Excluding warnings using @SuppressWarnings

为什么会这样,我该怎么办?使用PyCharm 2016.1.2,Python 2.7.10。

作为一种解决方法,我可以显式添加enter image description here,让PyCharm知道# type: dict[int, list]是一个字典,其中键是整数,值是列表,方法是添加{{1}}内联注释:< / p>

type hint

2 个答案:

答案 0 :(得分:2)

我认为你期待PyCharm能够从代码中推断太多。

提供类型提示注释为PyCharm提供了显示代码完成选项所需的信息。在这种情况下,您明确告诉PyCharm每个字典元素的值将是什么类型。

如果没有类型提示注释,您希望PyCharm能够知道在循环中分配字典时元素值的含义。对于PyCharm而言,这是太多的假设。正如Tadhg McDonald-Jensen在评论中提到的那样,对于PyCharm而言,这种情况过于动态,无法可靠地解决问题。代码完成经常是错误的。

答案 1 :(得分:1)

让我们考虑一个稍微复杂的变量场景:

for i in range(10):
    if i%2:
        x = 3
    else:
        x = "hello"
    x. #type hint for both int and str

在这种情况下,最后一行将为我们提供intstr的所有方法,因为PyCharm能够检测到x将是intstr

现在用x

替换my_dict[i]的所有出现
my_dict = {}
for i in range(10):
    if i%2:
        my_dict[i] = 3
    else:
        my_dict[i] = "hello"
    my_dict[i]. #no type hint :(

所有相同的规则都适用于上述情况,我们知道(并且PyCharm能够理解)my_dict[i]要么是int要么是str

但是,如果您没有初始化dict

,您会发生什么?
def f(my_dict): #or even (my_dict:dict)
    my_dict[1]. #cannot possibly expect a type hint

在这种情况下,无法知道dict的值是什么,然后添加显式注释,就像在示例中一样:

def f(my_dict:"dict[int,list]"):
    my_dict[1]. #get all the list methods

这确实强化了来自The Zen of Python的一些行:

  

明确比隐含更好   可读性很重要   面对模棱两可,拒绝猜测的诱惑   应该有一个 - 最好只有一个 - 显而易见的方法。

(我包含可读性,因为显式类型提示比潜在的隐藏赋值更容易阅读)