Warum beschwert sich der Inspektor von Pycharm über "d = {}"?

195

Beim Initialisieren eines Wörterbuchs mit d = {}Pycharms Code Inspector wird eine Warnung generiert

Diese Wörterbucherstellung könnte als Wörterbuchliteral umgeschrieben werden.

Wenn ich es umschreibe, verschwindet d = dict()die Warnung. Da es sich {}bereits um ein Wörterbuchliteral handelt, bin ich mir ziemlich sicher, dass die Nachricht fehlerhaft ist. Darüber hinaus scheint es wie beides d = {}und d = dict()ist gültig und pythonisch.

Diese verwandte Frage scheint zu schließen, dass die Wahl nur eine Frage des Stils / der Präferenz ist: Unterschiede zwischen "d = dict ()" und "d = {}"

Warum sollte sich Pycharm beschweren d = {}?

AKTUALISIEREN:

Mac hat es geschafft. Die Warnung galt tatsächlich für mehrere Zeilen, nicht nur für die gekennzeichnete.

Pycharm scheint nach einer Folge aufeinanderfolgender Anweisungen zu suchen, bei denen Sie ein Wörterbuch initialisieren und dann Werte im Wörterbuch festlegen. Dies löst beispielsweise die Warnung aus:

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

Aber dieser Code wird nicht:

d = {}
pass
d['a'] = 1
Chris Sears
quelle
2
zu laut, und es gibt keinen wirklichen Leistungsgewinn, nur eine weitere überflüssige Inspektion
schneidiger
Gleiches gilt für Listen: a = [1]; a.append (2), wahrscheinlich weil a = [1, 2] schöner ist ....
Cleros
Jep. nervige Nachricht. All diese Unterstreichungen von PyCharm machen es unangenehm, bevor das Programm ausgeführt wird.
Rajkumar R
Ich habe ein ähnliches Problem in JetBrains YouTrack gefunden - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 und es heißt: In diesem Fall schlägt PyCharm vor, dass Sie den Wert für das something Attribut direkt im Diktierliteral angeben können, anstatt es zuzuweisen in der nächsten Zeile.
Dudnikof

Antworten:

244

Was ist der folgende Code für Ihre Wörterbuchdeklaration?

Ich denke, Pycharm wird den Fehler auslösen, wenn Sie etwas haben wie:

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

wie du hätte schreiben können

dic = {'aaa': 5}

Übrigens: Die Tatsache, dass der Fehler verschwindet, wenn Sie die Funktion verwenden, bedeutet nicht unbedingt, dass Pycharm glaubt, dass es sich dict()um ein Literal handelt. Es könnte nur bedeuten, dass es sich nicht beschwert für:

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

HTH!

Mac
quelle
6
Anscheinend ist es für all diese nicht nützlichen lauten Inspektionen, leider schalten einige meiner Kollegen es ganz aus. Es ist eine Schande, weil es für viele Dinge wie PEP, ..., echte Probleme und echte Leistungshinweise nützlich ist.
Bindestrich
In meinem Fall ist diese Art des Umschreibens nicht möglich, da jedes erstellte Wörterbuchelement (aber das erste) vom zuvor erstellten Wörterbuchelement abhängt. Sie müssen also einzeln und nicht jedem Element gleichzeitig dem Wörterbuch zugewiesen werden. PyCharm beschwert sich jedoch immer noch und sagt, dass ich das Wörterbuch als Wörterbuchliteral erstellen sollte. Ich denke, ich muss die dic = dict()
Problemumgehung
@HelloGoodbye - ohne zu wissen , das Problem , das Sie versuchen , ich zu lösen kann eine qualifizierte Meinung nicht äußern, aber haben Sie als mit Start d = { 'aaa': f1(something) }dann d = f2(d)dann d = f3(d)etc ... Oder alternativ d['bbb'] = f2(d), d['ccc'] = f3(d)...?
Mac
Die Konstruktion ich habe , ist d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])etc.
Goodbye
5
@HelloGoodbye - Warum also nicht die ersten beiden zusammenführen d = {'a': A}und dann einfach die von Ihnen beschriebene Reihenfolge beibehalten?
Mac
15

Dies kann in den Projekteinstellungen oder Standardeinstellungen deaktiviert werden.

  • Navigieren Sie zu Einstellungen -> Inspektionen -> Python
  • Deaktivieren Sie "Wörterbucherstellung könnte durch Wörterbuchliteral umgeschrieben werden"
Craig Jackson
quelle
Dies ist, was ich getan habe und kann bestätigen, dass es gut funktioniert. Mein Code war: payload = {** BASEPAYLOAD, ** ExtraPayload}, um zwei Wörterbücher zusammenzuführen, und es wurde der Fehler ausgelöst.
pa1983
9

für diejenigen, die (genau wie ich) Wörterbücher mit einer einzigen Operation initialisieren möchten

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

statt vieler Zeilen wie

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

Am Ende kam ich zu folgendem:

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

Pycharm beschwert sich nicht darüber

Igor.K
quelle
7
Ich krieche. :( Sie haben also tatsächlich die Menge an Code erhöht und ihn weniger klar und langsamer ausgeführt, nur um eine Warnung in dem Editor zu entfernen, den Sie gerade verwenden ... Ich verwende kein Pycharm, aber ich würde annehmen, dass es einige gibt Art von Konfigurationsumschalter, der die Warnung deaktiviert und es Ihnen ermöglicht, weiterhin auf pythonische Weise zu codieren. :)
Mac
2
@mac Ich stimme jetzt zu. Ich war jung und dumm) seitdem habe ich mich (ein bisschen) verändert und nur diese Warnungen deaktiviert
Igor.K
Lol! Dies muss der denkwürdigste Zeitversatzkommentar sein, den ich je erhalten habe! ;)
Mac
0
mydict = {
  a: 5,
  b:z+c/2
}

Das Wörterbuch könnte direkt erstellt worden sein, ohne sie zuerst zu initialisieren und dann neue Werte zuzuweisen.

Asnim P Ansari
quelle
0

Ich habe eine Situation, in der diese Warnung mich verdammt nervt. In meinem Fall fülle ich mein Diktat teilweise als Literale und teilweise aus einem Tupel, das von einer Funktion ausgegeben wird, wie folgt:

def get_other_values():
    return 3, 4

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

Sofern ich keine vorläufigen Variablen für die Ausgabe von get_other_values ​​erstelle, generiert PEP8 diese Warnung, obwohl ich das Diktat mit Literalen erstelle. Und ich kann die Tasten c und d im Literal nicht zuweisen, da die Werte als Tupel ausgegeben werden.

Chris Woodfield
quelle