我有一个简单的代码片段,我将字典值设置为空列表:
new_dict[i]
现在,如果在下一行的循环内我输入list
并添加一个点,我希望PyCharm向我展示一个可用于new_dict
的方法列表,但是PyCharm无法识别这个简单案例中的字典值类型:
Excluding warnings using @SuppressWarnings
为什么会这样,我该怎么办?使用PyCharm 2016.1.2,Python 2.7.10。
作为一种解决方法,我可以显式添加,让PyCharm知道# type: dict[int, list]
是一个字典,其中键是整数,值是列表,方法是添加{{1}}内联注释:< / p>
答案 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
在这种情况下,最后一行将为我们提供int
和str
的所有方法,因为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
这确实强化了来自The Zen of Python的一些行:
明确比隐含更好 可读性很重要 面对模棱两可,拒绝猜测的诱惑 应该有一个 - 最好只有一个 - 显而易见的方法。
(我包含可读性,因为显式类型提示比潜在的隐藏赋值更容易阅读)