关于python:为什么Pycharm的检查员会抱怨“d = {}”?

Why does Pycharm's inspector complain about “d = {}”?

当使用d = {}pycharm的代码检查器初始化字典时,会生成一个警告,说

This dictionary creation could be rewritten as a dictionary literal.

如果我重写了它,警告就会消失。由于{}已经是字典的字面意思了,我很肯定这个消息是错误的。此外,似乎d = {}d = dict()都是有效的和脓毒气的。

这个相关的问题似乎得出结论,选择只是风格/偏好的问题:"d=dict()"和"d="之间的差异

为什么Pycharm会抱怨d = {}

更新:

麦克把它钉牢了。警告实际应用于多行,而不仅仅是标记的行。

pycharm似乎在寻找一系列连续语句,在这些语句中初始化字典,然后在字典中设置值。例如,这将触发警告:

1
2
d = {}
d['a'] = 1

但此代码不会:

1
2
3
d = {}
pass
d['a'] = 1


您的字典声明中的以下代码是什么?

我认为如果你有以下情况,Pycharm会触发错误:

1
2
dic = {}
dic['aaa'] = 5

就像你写的那样

1
dic = {'aaa': 5}

顺便说一句:如果使用函数,错误就会消失,这并不意味着pycharm相信dict()是一个文本。这可能意味着它不会抱怨:

1
2
dic = dict()
dic['aaa'] = 5

嗯!


这可以在项目设置或默认设置中禁用。

  • 导航到设置->检查->python
  • 取消选中"字典文字可以重写字典创建"


对于那些喜欢(和我一样)用一个操作初始化字典的人

1
2
3
4
5
d = {
  'a': 12,
  'b': 'foo',
  'c': 'bar'
}

而不是像

1
2
3
d = dict()
d['a'] = 12
d['b'] = ....

最后我得到了这样的结果:

1
2
3
4
5
6
d = dict()
d.update({
  'a': 12,
  'b': 'foo',
  'c': 'bar'
})

Pycharm对此没有抱怨


我有一种情况,这种警告正折磨着我。在我的例子中,我将我的dict部分填充为文本,部分填充为函数输出的元组,如下所示:

1
2
3
4
5
6
7
8
def get_other_values():
    return 3, 4

foo = {
   "a": 1,
   "b": 2
}
foo["c"], foo["d"] = get_other_values()

所以,除非我为get_other_值的输出创建临时变量,否则pep8会生成这个警告,即使我正在用文本创建dict。我不能在文本中指定C和D键,因为这些值是作为元组输出的。


1
2
3
4
mydict = {
  a: 5,
  b:z+c/2
}

字典可以直接创建,而不需要先初始化它们,然后重新分配新值。