首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyCharm不识别字典值类型

问PyCharm不识别字典值类型
EN

Stack Overflow用户
提问于 2016-05-03 17:41:57
回答 2查看 4.3K关注 0票数 4

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

代码语言:javascript
复制
new_dict = {}
for i in range(1, 13):
    new_dict[i] = []

现在,如果在下一行的循环中键入new_dict[i]并添加一个点,我希望PyCharm向我显示一个list可用的方法列表,但在这种简单的情况下,PyCharm无法识别字典值类型:

​

​

为什么会发生这种事,我能做些什么?使用PyCharm 2016.1.2,Python2.7.10。

作为解决办法,我可以显式地添加一个类型提示,通过添加一个# type: dict[int, list]内联注释,让PyCharm知道new_dict是一个字典,其中键是整数,值是列表:

​

​

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-03 19:14:12

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

代码语言:javascript
复制
for i in range(10):
    if i%2:
        x = 3
    else:
        x = "hello"
    x. #type hint for both int and str

在本例中,最后一行将给出ints和strs的所有方法,因为PyCharm能够检测到x要么是int,要么是str。

现在将所有x的出现替换为my_dict[i]。

代码语言:javascript
复制
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,您会期望发生什么?

代码语言:javascript
复制
def f(my_dict): #or even (my_dict:dict)
    my_dict[1]. #cannot possibly expect a type hint

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

代码语言:javascript
复制
def f(my_dict:"dict[int,list]"):
    my_dict[1]. #get all the list methods

这确实增强了Python的禅宗中的一些行

外显好于内隐。 可读性很重要。 面对歧义,拒绝猜测的诱惑。 应该有1,最好只有一种--很明显的方法。

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

票数 1
EN

Stack Overflow用户

发布于 2016-05-03 18:31:49

我认为您希望PyCharm能够从代码中推断出太多的信息。

提供类型提示注释将为PyCharm提供显示代码完成选项所需的信息。在本例中,您将显式地告诉PyCharm每个字典元素的值是什么类型。

如果没有类型提示注释,您希望PyCharm能够知道当您在循环中分配它时,字典的元素值将是什么。这是PyCharm无法做出的太多假设。正如Tadhg麦克唐-詹森在评论中提到的那样,对于PyCharm来说,这种情况太动态性,无法可靠地解决。代码完成会经常出错。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37010854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档