我有一个简单的代码片段,其中我将字典值设置为空列表:
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是一个字典,其中键是整数,值是列表:

发布于 2016-05-03 19:14:12
让我们考虑一个带有变量的稍微复杂的场景:
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]。
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这确实增强了Python的禅宗中的一些行
外显好于内隐。 可读性很重要。 面对歧义,拒绝猜测的诱惑。 应该有1,最好只有一种--很明显的方法。
(我包括可读性,因为显式类型提示比潜在的隐藏任务更容易阅读)
发布于 2016-05-03 18:31:49
我认为您希望PyCharm能够从代码中推断出太多的信息。
提供类型提示注释将为PyCharm提供显示代码完成选项所需的信息。在本例中,您将显式地告诉PyCharm每个字典元素的值是什么类型。
如果没有类型提示注释,您希望PyCharm能够知道当您在循环中分配它时,字典的元素值将是什么。这是PyCharm无法做出的太多假设。正如Tadhg麦克唐-詹森在评论中提到的那样,对于PyCharm来说,这种情况太动态性,无法可靠地解决。代码完成会经常出错。
https://stackoverflow.com/questions/37010854
复制相似问题