Pourquoi l'inspecteur de Pycharm se plaint-il de «d = {}»?

195

Lors de l'initialisation d'un dictionnaire avec d = {}l'inspecteur de code de Pycharm génère un avertissement, disant

Cette création de dictionnaire pourrait être réécrite en tant que littéral de dictionnaire.

Si je le réécris, d = dict()l'avertissement disparaît. Puisqu'il s'agit{} déjà d' un dictionnaire littéral, je suis presque sûr que le message est erroné. En outre, il semble être à la fois et sont valides et Pythonic.d = {}d = dict()

Cette question connexe semble conclure que le choix n'est qu'une question de style / préférence: différences entre "d = dict ()" et "d = {}"

Pourquoi Pycharm se plaindrait d = {}?

METTRE À JOUR:

Mac l'a cloué. L'avertissement s'appliquait en fait à plusieurs lignes, pas seulement à celle qui était signalée.

Pycharm semble rechercher une séquence d'instructions consécutives où vous initialisez un dictionnaire puis définissez des valeurs dans le dictionnaire. Par exemple, cela déclenchera l'avertissement:

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

Mais ce code ne:

d = {}
pass
d['a'] = 1
Chris Sears
la source
2
trop bruyant, et il n'y a pas de gain de performances réel, juste une inspection de plus superflue
dashesy
La même chose se produit pour les listes: a = [1]; a.append (2), probablement parce que a = [1, 2] est plus agréable ....
cleros
Ouaip. message ennuyeux. tous ces soulignements de PyCharm rendent inconfortable avant d'exécuter le programme.
Rajkumar R
J'ai trouvé un problème similaire dans JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 et il dit: Dans ce cas, PyCharm suggère que vous pouvez fournir la valeur de l' something attribut directement dans le littéral dict au lieu de l'assigner. à la ligne suivante.
Dudnikof

Réponses:

244

Quel est le code suivant de votre déclaration de dictionnaire?

Je pense que pycharm déclenchera l'erreur si vous avez quelque chose comme:

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

comme tu aurais pu écrire

dic = {'aaa': 5}

BTW: Le fait que l'erreur disparaisse si vous utilisez la fonction ne signifie pas nécessairement que pycharm pense que dict()c'est un littéral. Cela pourrait simplement signifier qu'il ne se plaint pas de:

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

HTH!

Mac
la source
6
apparemment, c'est pour toutes ces inspections bruyantes non utiles, malheureusement certains de mes collègues le désactivent complètement, c'est dommage car il est utile pour beaucoup de choses comme PEP, ..., de vrais problèmes et de vrais indices de performance.
dashesy
Dans mon cas, ce type de réécriture n'est pas possible, car chaque élément de dictionnaire créé (mais le premier) dépend de l'élément de dictionnaire précédent créé. Ils doivent donc être affectés au dictionnaire un par un plutôt qu'à chaque élément en même temps. Cependant, PyCharm se plaint toujours et dit que je devrais créer le dictionnaire comme un littéral de dictionnaire. Je suppose que je dois utiliser la dic = dict()solution de contournement ...
HelloGoodbye
@HelloGoodbye - Sans connaître le problème que vous essayez de résoudre, je ne peux pas exprimer une opinion avec réserve, mais avez-vous envisagé de commencer par d = { 'aaa': f1(something) }là, d = f2(d)puis d = f3(d)etc ... Ou bien d['bbb'] = f2(d), d['ccc'] = f3(d)...?
mac
La construction est je d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b']), etc.
hellogoodbye
5
@HelloGoodbye - Alors, pourquoi ne pas fusionner les deux premiers d = {'a': A}et ensuite simplement conserver la séquence comme vous l'avez indiqué?
mac
15

Cela peut être désactivé dans les paramètres du projet ou les paramètres par défaut.

  • Accédez à Paramètres -> Inspections -> Python
  • Décochez "La création du dictionnaire pourrait être réécrite par le littéral du dictionnaire"
Craig Jackson
la source
C'est ce que j'ai fait et je peux confirmer que cela fonctionne bien. Mon code était: payload = {** BASEPAYLOAD, ** ExtraPayload} pour fusionner deux dictionnaires et il lançait l'erreur.
pa1983
9

pour ceux qui aiment (comme moi) initialiser des dictionnaires avec une seule opération

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

au lieu de nombreuses lignes comme

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

à la fin, je me suis retrouvé avec ceci:

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

Pycharm ne se plaint pas de cela

Igor.K
la source
7
Je grince des dents. :( Donc, vous avez en fait augmenté la quantité de code et rendu moins clair et plus lent juste pour vous débarrasser d'un avertissement dans l'éditeur que vous utilisez ... Je n'utilise pas pycharm, mais je suppose qu'il y en a sorte de bascule de configuration qui désactivera l'avertissement et vous permettra de continuer à coder de manière pythonique. :)
mac
2
@mac Je suis d'accord maintenant. J'étais jeune et stupide) depuis lors, j'ai changé (un peu) et je viens de désactiver ces avertissements
Igor.K
Lol! Ce doit être le commentaire de décalage horaire le plus mémorable que j'ai jamais reçu! ;)
mac
0
mydict = {
  a: 5,
  b:z+c/2
}

Le dictionnaire aurait pu être créé directement sans les initialiser d'abord, puis réaffecter de nouvelles valeurs.

Asnim P Ansari
la source
0

J'ai une situation où cet avertissement me dérange. Dans mon cas, je remplis mon dict partiellement en littéraux et partiellement à partir d'une sortie de tuple par une fonction, comme ceci:

def get_other_values():
    return 3, 4

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

Donc, à moins que je ne crée des variables intermédiaires pour la sortie de get_other_values, PEP8 génère cet avertissement même si je crée le dict avec des littéraux. Et je ne peux pas affecter les touches c et d dans le littéral, car les valeurs sont sorties comme un tuple.

Chris Woodfield
la source