Pycharmのインスペクターが「d = {}」について文句を言うのはなぜですか?


195

d = {}Pycharmのコードインスペクターで辞書を初期化すると、次のような警告が表示されます。

この辞書の作成は、辞書リテラルとして書き直すことができます。

書き換えればd = dict()警告は消えます。以来{}、すでにある辞書リテラル、私はかなり確信してメッセージが誤っていますよ。さらに、それは両方のようでありd = {}d = dict()有効かつPythonicです。

この関連する質問は、選択はスタイル/好みの問題であると結論付けるようです: "d = dict()"と "d = {}"の違い

Pycharmが不満を言うのはなぜd = {}ですか?

更新:

マックはそれを釘付けにした。警告は実際には、フラグが付けられた行だけでなく、複数の行に適用されました。

Pycharmは、辞書を初期化してから辞書に値を設定する一連の連続したステートメントを探しているようです。たとえば、これは警告をトリガーします。

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

しかし、このコードはしません:

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

2
うるさい、と本当のパフォーマンスの向上は、ちょうど1より余計検査はありません
dashesy

リストでも同じことが起こります:a = [1]; a。[append(2)、おそらくa = [1、2]の方が
いいので

うん。迷惑なメッセージ。PyCharmによるこれらすべての下線は、プログラムを実行する前に不快にさせます。
Rajkumar R

JetBrains YouTrackで同様の問題を見つけました-youtrack.jetbrains.com/issue/PY-19269#u=1461253420326とあります:この場合、PyCharmは、something 属性の値を割り当てるのではなく、dictリテラルに直接入力できることを示唆しています次の行で。
Dudnikof

回答:


244

辞書宣言の次のコードは何ですか?

私はあなたが次のようなものを持っている場合、pycharmがエラーをトリガーすると思います:

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

あなたが書いたように

dic = {'aaa': 5}

ところで:関数を使用してもエラーがなくなるという事実dict()は、必ずしもpycharm がリテラルであると信じていることを意味するわけではありません。それは文句を言わないことを単に意味するかもしれません:

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

HTH!


6
明らかにそれはこれらすべての役に立たない騒々しい検査のためであり、残念ながら私の同僚の何人かはそれを完全にオフにします、それはPEP、...、実際の問題や実際のパフォーマンスのヒントのような多くのものに役立つので残念です。
ダッシュ1995年

私の場合、作成された各ディクショナリアイテム(ただし最初のディクショナリ)は以前に作成されたディクショナリアイテムに依存しているため、このタイプの書き換えは不可能です。そのため、すべてのアイテムを同時にではなく、1つずつ辞書に割り当てる必要があります。ただし、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-では、最初の2つをd = {'a': A}とマージし、その後、概要を説明したとおりにシーケンスを維持してみませんか?
mac

15

これは、プロジェクト設定またはデフォルト設定で無効にできます。

  • [設定]-> [検査]-> [Python]に移動します
  • 「辞書の作成は辞書リテラルによって書き換えられる可能性があります」のチェックを外します

これは私がやったことであり、それがうまく機能していることを確認できます。私のコードは次のとおりです。ペイロード= {** BASEPAYLOAD、** ExtraPayload}が2つの辞書をマージし、エラーをスローしていました。
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を使用しませんが、いくつかあると思います警告を無効にし、Pythonの方法でコーディングを続行できるようにする構成切り替えの一種です:)
mac

2
@mac私は今同意します。私は若くて愚かでした)それ以来、私は(少し)変更し、警告を無効にしました
Igor.K

笑!これは私がこれまでに受け取った中で最も記憶に残る時間オフセットのコメントでなければなりません!;)
mac

0
mydict = {
  a: 5,
  b:z+c/2
}

辞書は、最初に初期化してから新しい値を再割り当てすることなく、直接作成することができます。


0

私はこの警告が私の地獄を悩ませている状況にあります。私の場合、次のように、部分的にリテラルとして、および関数によって出力されたタプルから部分的にdictを生成しています。

def get_other_values():
    return 3, 4

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

したがって、get_other_valuesの出力用に中間変数を作成しない限り、リテラルを使用してdictを作成している場合でも、PEP8はこの警告を生成します。また、値はタプルとして出力されるため、リテラルにcキーとdキーを割り当てることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.