Pycharm的检查员为何抱怨“ d = {}”?


195

d = {}Pycharm的代码检查器初始化字典时,会产生警告,说

这个字典的创建可以重写为字典文字。

如果我重写它d = dict(),警告就会消失。由于{}已经字典文字,因此我很确定该消息是错误的。此外,似乎都d = {}d = dict()有效,Python化。

这个相关的问题似乎可以得出结论,选择只取决于样式/偏好: “ d = dict()”和“ d = {}”之间的差异

皮查姆为什么会抱怨d = {}

更新:

Mac钉了它。该警告实际上适用于多行,而不仅仅是标记的行。

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

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

但是此代码不会:

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

2
太吵了,也没有真正的性能提升,仅是多余的一项检查
破译了2015年

列表也会发生同样的事情:a = [1]; a.append(2),可能是因为a = [1,2]更好....
cleros

对。烦人的消息。在执行程序之前,PyCharm的所有这些强调使您感到不舒服。
Rajkumar R

我在JetBrains YouTrack中发现了类似的问题-youtrack.jetbrains.com/issue/PY-19269#u=1461253420326,它说:在这种情况下,PyCharm建议您可以something 在dict文字中直接提供属性值,而不是分配它在下一行。
Dudnikof

Answers:


244

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

我认为pycharm将在出现以下情况时触发错误:

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

如你所写

dic = {'aaa': 5}

顺便说一句:如果您使用该函数,错误就会消失,但这并不一定意味着pycharm认为这dict()是文字。这可能只是意味着它不会抱怨:

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

HTH!


6
显然,所有这些无用的噪音检查都是不幸的,我的一些同事完全将其关闭了,这很可惜,因为它对诸如PEP,...,实际问题和实际性能提示之类的许多事情很有用。
2015年

在我的情况下,这种类型的重写是不可能的,因为创建的每个字典项(但第一个字典项)都取决于先前创建的字典项。因此,必须将它们一个一个地分配给字典,而不是同时分配给每个项目。但是,PyCharm仍然抱怨并说我应该将字典创建为字典文字。我猜我必须使用dic = dict()解决方法...
HelloGoodbye

@HelloGoodbye-在不知道您要解决的问题的情况下,我无法发表有说服力的意见,但是您是否考虑过d = { 'aaa': f1(something) }从那时开始,然后d = f2(d)d = f3(d)等等...或者d['bbb'] = f2(d)d['ccc'] = f3(d)...?
mac

我有建设d = {}d['a'] = Ad['b'] = f(d['a'])d['c'] = f(d['b']),等
HelloGoodbye

5
@HelloGoodbye-那么,为什么不将前两个与合并d = {'a': A},然后只保留您概述的顺序呢?
mac

15

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

  • 导航到设置->检查-> Python
  • 取消选中“字典创建可以用字典文字重写”

这就是我所做的,可以确认它运作良好。我的代码是:payload = {** BASEPAYLOAD,** ExtraPayload}以合并两个字典,并且抛出错误。
pa1983

9

对于那些喜欢(就像我一样)通过单个操作初始化字典的人

d = {
  'a': 12,
  'b': 'foo',
  'c': 'bar'
}

而不是像

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

最后,我得出以下结论:

d = dict()
d.update({
  'a': 12,
  'b': 'foo',
  'c': 'bar'
})

Pycharm没有对此抱怨


7
我畏缩。:(因此,您实际上增加了代码量,并使代码不那么清楚,并且运行速度变慢,只是为了摆脱您偶然使用的编辑器中的警告...我不使用pycharm,但我认为这里有一些某种配置切换将禁用警告,并允许您以pythonic方式继续编码。:)
mac

2
@mac我现在同意。从那时起,我还很小又很笨()从那时起,我就改变了(有点)并禁用了这些警告
Igor.K,

大声笑!这一定是我收到的最令人难忘的时间偏移评论!;)
mac


0

我遇到这样的情况,该警告使我烦恼不已。就我而言,我将字典部分填充为文字,并部分地从函数的元组输出中填充,如下所示:

def get_other_values():
    return 3, 4

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

因此,除非我为get_other_values的输出创建临时var,否则即使我使用文字创建dict,PEP8也会生成此警告。而且我无法在文字中分配c和d键,因为这些值以元组形式输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.