为啥 Pycharm 的检查器会抱怨“d = ”?

Posted

技术标签:

【中文标题】为啥 Pycharm 的检查器会抱怨“d = ”?【英文标题】:Why does Pycharm's inspector complain about "d = "?为什么 Pycharm 的检查器会抱怨“d = ”? 【发布时间】:2012-01-14 10:17:22 【问题描述】:

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

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

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

这个相关问题似乎得出结论,选择只是风格/偏好问题: differences between "d = dict()" and "d = "

为什么 Pycharm 会抱怨 d =

更新:

Mac 做到了。该警告实际上应用于多行,而不仅仅是被标记的那一行。

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

d = 
d['a'] = 1

但是这段代码不会:

d = 
pass
d['a'] = 1

【问题讨论】:

太吵了,并没有真正的性能提升,只是多了一个多余的检查 列表也会发生同样的事情:a = [1]; a.append(2),可能是因为 a=[1, 2] 更好...... 是的。烦人的消息。 PyCharm 的所有这些下划线在执行程序之前都会让人感到不舒服。 我在 JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 中发现了类似的问题,它说:在这种情况下,PyCharm 建议您可以将 something 属性的值直接提供到 dict 文字中,而不是在下一行。 【参考方案1】:

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

我认为如果你有类似的情况,PyCharm 会触发错误:

dic = 
dic['aaa'] = 5

就像你写的那样

dic = 'aaa': 5

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

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

【讨论】:

显然它适用于所有这些无用的嘈杂检查,不幸的是我的一些同事完全关闭了它,这是一种耻辱,因为它对很多事情都很有用,比如 PEP,......,真正的问题和真实的性能提示。 在我的情况下,这种类型的重写是不可能的,因为创建的每个字典项(但第一个)都依赖于创建的前一个字典项。所以它们必须被一个一个地分配给字典,而不是同时分配给每个项目。但是,PyCharm 仍然抱怨说我应该将字典创建为字典文字。我想我必须使用dic = dict() 解决方法... @HelloGoodbye - 在不知道您要解决的问题的情况下,我无法发表有资格的意见,但您是否考虑过从 d = 'aaa': f1(something) 然后 d = f2(d) 然后 d = f3(d) 等开始...或者d['bbb'] = f2(d)d['ccc'] = f3(d) ...? 我的结构是d = d['a'] = Ad['b'] = f(d['a'])d['c'] = f(d['b']) @HelloGoodbye - 那么,为什么不将前两个与d = 'a': A 合并,然后按照您概述的顺序保持?【参考方案2】:

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

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

【讨论】:

这就是我所做的,并且可以确认它运行良好。我的代码是:payload = **BASEPAYLOAD, **ExtraPayload 合并两个字典,它抛出了错误。【参考方案3】:

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

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 对此没有抱怨

【讨论】:

我畏缩了。 :( 所以,你实际上增加了代码量,让它变得不那么清晰,运行速度变慢只是为了摆脱你碰巧使用的编辑器中的警告......我不使用 pycharm,但我假设有一些一种配置切换,它将禁用警告并允许您继续以 Python 方式编码。:) @mac 我现在同意。我年轻又愚蠢)从那以后我改变了(一点点),只是禁用了这些警告 大声笑!这一定是我收到的最难忘的时间偏移评论! ;)【参考方案4】:
mydict = 
  a: 5,
  b:z+c/2

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

【讨论】:

【参考方案5】:

我有一种情况,这个警告让我心烦意乱。就我而言,我将我的 dict 部分填充为文字,部分从函数输出的元组中填充,如下所示:

def get_other_values():
    return 3, 4

foo = 
    "a": 1,
    "b": 2

foo["c"], foo["d"] = get_other_values()

因此,除非我为 get_other_values 的输出创建临时变量,否则 PEP8 会生成此警告,即使我使用文字创建 dict。而且我不能在文字中分配 c 和 d 键,因为这些值是作为元组输出的。

【讨论】:

以上是关于为啥 Pycharm 的检查器会抱怨“d = ”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥useSelector里面的选择器会运行两次?

为啥终结器会有“严重的性能损失”?

PyCharm 在 python 函数调用中抱怨括号

为啥 DevkitARM GBA 链接器会检测到多个定义?

为啥用PyCharm编辑Python代码的时候,代码没有错,为啥代码下面还是有波浪线呢?

为啥 WEKA NaiveBayes 分类器会给出标准。开发。全零属性的值?