Waarom klaagt de inspecteur van Pycharm over "d = {}"?

Bij het initialiseren van een woordenboek met d = {} genereert de code-inspecteur van Pycharm een ​​waarschuwing,

Deze woordenlijst kan worden herschreven als een letterlijke letterlijke tekst.

Als ik het d = dict() herschrijf, verdwijnt de waarschuwing. Omdat {} reeds is is een letterlijke vertaling, ik ben er vrij zeker van dat het bericht onjuist is. Verder lijkt het alsof zowel d = {} en d = dict() geldig zijn en Pythonic.

This related question seems to conclude that the choice is just a matter of style/preference: differences between "d = dict()" and "d = {}"

Waarom zou Pycharm klagen over d = {} ?

UPDATE:

Mac heeft het genageld. De waarschuwing is daadwerkelijk toegepast op meerdere regels, niet alleen degene die is gemarkeerd.

Pycharm lijkt te zoeken naar een reeks opeenvolgende instructies waarin u een woordenboek initialiseert en vervolgens waarden in het woordenboek instelt. Dit zal bijvoorbeeld de waarschuwing activeren:

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

Maar deze code zal niet:

d = {}
pass
d['a'] = 1
136
JEP. irritant bericht. al die onderstreept door PyCharm maakt een ongemakkelijk voordat het programma wordt uitgevoerd.
toegevoegd de auteur Rajkumar Rajendran, de bron
Ik vond hetzelfde probleem in JetBrains YouTrack - youtrack.jetbrains.com/issue/PY- 19269 # u = 1461253420326 en er staat: PyCharm stelt in dit geval voor dat u de waarde voor het kenmerk something rechtstreeks in het letterlijke dictaat kunt invoeren in plaats van deze op de volgende regel toe te wijzen.
toegevoegd de auteur Dudnikof, de bron
te lawaaierig, en er is geen echte prestatiewinst, slechts één extra overbodige inspectie
toegevoegd de auteur dashesy, de bron
Hetzelfde gebeurt voor lijsten: a = [1]; a.append (2), waarschijnlijk omdat a = [1, 2] leuker is ....
toegevoegd de auteur cleros, de bron

4 antwoord

Wat is de volgende code voor uw woordenboekverklaring?

Ik denk dat pycharm de fout zal activeren als je zoiets hebt als:

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

zoals je zou kunnen hebben geschreven

dic = {'aaa': 5}

BTW: Het feit dat de fout weggaat als u de functie gebruikt betekent niet noodzakelijk dat pycharm gelooft dat dict() een letterlijke betekenis heeft. Het kan alleen maar betekenen dat het niet klagen voor:

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

HTH!

175
toegevoegd
@HelloGoodbye - Zonder het probleem te kennen dat je probeert op te lossen, kan ik geen gekwalificeerde mening geven, maar heb je overwogen om te beginnen met d = {'aaa': f1 (something)} then d = f2 (d) dan d = f3 (d) etc ... Of alternatief d ['bbb'] = f2 (d) , < code> d ['ccc'] = f3 (d) ...?
toegevoegd de auteur mac, de bron
@HelloGoodbye - Dus waarom zou u de eerste twee niet samenvoegen met d = {'a': A} en dan gewoon de reeks behouden zoals u hebt geschetst?
toegevoegd de auteur mac, de bron
In mijn geval is dit type herschrijven niet mogelijk, omdat elk woordenboekitem dat is gemaakt (maar het eerste) afhankelijk is van het vorige gemaakte woordenboekitem. Ze moeten dus één voor één aan het woordenboek worden toegewezen in plaats van elk item op hetzelfde moment. PyCharm klaagt echter nog steeds en zegt dat ik het woordenboek letterlijk als een woordenboek moet maken. Ik denk dat ik de oplossing dic = dict() moet gebruiken ...
toegevoegd de auteur HelloGoodbye, de bron
De constructie die ik heb is d = {} , d ['a'] = A , d ['b'] = f (d ['a' ]) , d ['c'] = f (d ['b']) , etc.
toegevoegd de auteur HelloGoodbye, de bron
blijkbaar is het voor al deze niet-bruikbare luidruchtige inspecties helaas dat sommige van mijn collega's het helemaal uitzetten, het is jammer omdat het nuttig is voor veel dingen zoals PEP, ..., echte problemen en echte prestatie-tips.
toegevoegd de auteur dashesy, de bron

Dit kan worden uitgeschakeld in de projectinstellingen of standaardinstellingen.

  • Navigate to Settings -> Inspections -> Python
  • Uncheck "Dictionary creation could be rewritten by dictionary literal"
6
toegevoegd
Dit is wat ik deed en kan bevestigen dat het goed werkt. Mijn code was: payload = {** BASEPAYLOAD, ** ExtraPayload} om twee woordenboeken samen te voegen en deze gooide de fout.
toegevoegd de auteur pa1983, de bron

voor degenen die graag (net als ik) woordenboeken initialiseren met een enkele bewerking

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

in plaats van veel lijnen zoals

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

op het einde eindigde ik hiermee:

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

Pycharm klaagt hier niet over

5
toegevoegd
Ik krimp ineen. :( Dus je hebt de hoeveelheid code daadwerkelijk verhoogd en minder duidelijk gemaakt en loopt langzamer, gewoon om een ​​waarschuwing te verwijderen in de editor die je toevallig gebruikt ... Ik gebruik geen pycharm, maar ik neem aan dat er een aantal is soort configuratieschakelaar die de waarschuwing uitschakelt en u in staat stelt om op een pythonische manier te blijven coderen :)
toegevoegd de auteur mac, de bron
Lol! Dit moet de meest memorabele time-offsetcommentaar zijn die ik ooit heb gekregen! ;)
toegevoegd de auteur mac, de bron
@mac Ik ben het nu eens. Ik was jong en stom) sindsdien ben ik (een beetje) veranderd en heb ik die waarschuwingen uitgeschakeld
toegevoegd de auteur Igor Kurochka, de bron
mydict = {
  a: 5,
  b:z+c/2
}

Het woordenboek kan rechtstreeks zijn gemaakt zonder ze eerst te initialiseren en vervolgens nieuwe waarden opnieuw toe te wijzen.

1
toegevoegd