¿Por qué el inspector de Pycharm se queja de "d = {}"?

195

Al inicializar un diccionario con d = {}el inspector de código de Pycharm, se genera una advertencia que dice:

La creación de este diccionario podría reescribirse como literal del diccionario.

Si lo reescribo, d = dict()la advertencia desaparece. Como {}ya es un diccionario literal, estoy bastante seguro de que el mensaje es erróneo. Además, parece ambos d = {}y d = dict()son válidos y pitónicos.

Esta pregunta relacionada parece concluir que la elección es solo una cuestión de estilo / preferencia: diferencias entre "d = dict ()" y "d = {}"

¿Por qué se quejaría Pycharm d = {}?

ACTUALIZAR:

Mac lo clavó. La advertencia en realidad se aplica a varias líneas, no solo a la marcada.

Pycharm parece buscar una secuencia de declaraciones consecutivas donde inicializa un diccionario y luego establece valores en el diccionario. Por ejemplo, esto activará la advertencia:

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

Pero este código no:

d = {}
pass
d['a'] = 1
Chris Sears
fuente
2
demasiado ruidoso, y no hay un aumento real en el rendimiento, solo una inspección superflua más
guionizada
Lo mismo sucede para las listas: a = [1]; a.append (2), probablemente porque a = [1, 2] es mejor ...
cleros
Sip. Mensaje molesto. todos esos subrayados de PyCharm lo incomodan antes de ejecutar el programa.
Rajkumar R
Encontré un problema similar en JetBrains YouTrack: youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 y dice: En este caso, PyCharm sugiere que puede proporcionar el valor para el something atributo directamente en el literal dict en lugar de asignarlo en la proxima linea.
Dudnikof

Respuestas:

244

¿Cuál es el siguiente código para la declaración de tu diccionario?

Creo que pycharm activará el error si tienes algo como:

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

como podrías haber escrito

dic = {'aaa': 5}

Por cierto: el hecho de que el error desaparezca si usas la función no necesariamente significa que pycharm cree que dict()es un literal. Simplemente podría significar que no se queja por:

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

HTH!

Mac
fuente
66
aparentemente es para todas estas inspecciones ruidosas no útiles desafortunadamente algunos de mis colegas lo apagan por completo, es una pena porque es útil para muchas cosas como PEP, ..., problemas reales y sugerencias de rendimiento real.
guiones el
En mi caso, ese tipo de reescritura no es posible, ya que cada elemento del diccionario que se crea (pero el primero) depende del elemento del diccionario creado anteriormente. Por lo tanto, deben asignarse al diccionario uno por uno en lugar de cada elemento al mismo tiempo. Sin embargo, PyCharm todavía se queja y dice que debería crear el diccionario como literal del diccionario. Supongo que tengo que usar la dic = dict()solución ...
HelloGoodbye
@HelloGoodbye - Sin saber el problema que estás tratando de resolver, no puedo expresar una opinión calificada, pero ¿has considerado comenzar con d = { 'aaa': f1(something) }eso, d = f2(d)entonces, d = f3(d)etc ... O d['bbb'] = f2(d), alternativamente , d['ccc'] = f3(d)...?
mac
La construcción que tengo es d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b']), etc
HelloGoodbye
55
@HelloGoodbye - Entonces, ¿por qué no fusionar los dos primeros d = {'a': A}y luego simplemente mantener la secuencia como se describe?
mac
15

Esto se puede deshabilitar en la Configuración del proyecto o la Configuración predeterminada.

  • Navegue a Configuración -> Inspecciones -> Python
  • Desmarque "La creación del diccionario podría reescribirse por diccionario literal"
Craig Jackson
fuente
Esto es lo que hice y puedo confirmar que funciona bien. Mi código era: payload = {** BASEPAYLOAD, ** ExtraPayload} para fusionar dos diccionarios y arrojaba el error.
pa1983
9

para aquellos a quienes les gusta (como yo) inicializar diccionarios con una sola operación

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

en lugar de muchas líneas como

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

Al final terminé con esto:

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

Pycharm no se queja de esto

Igor.K
fuente
77
Me estremezco. :( Entonces, en realidad aumentó la cantidad de código y lo hizo menos claro y se ejecuta más lento solo para deshacerse de una advertencia en el editor que utiliza ... No uso pycharm, pero supongo que hay algunos tipo de cambio de configuración que deshabilitará la advertencia y le permitirá seguir codificando de manera pitónica. :)
mac
2
@mac Estoy de acuerdo ahora. Yo era joven y estúpido) desde entonces he cambiado (un poco) y simplemente deshabilité esas advertencias
Igor.K
Jajaja ¡Este debe ser el comentario de desplazamiento de tiempo más memorable que he recibido! ;)
mac
0
mydict = {
  a: 5,
  b:z+c/2
}

El diccionario podría haberse creado directamente sin inicializarlos primero y luego reasignar nuevos valores.

Asnim P Ansari
fuente
0

Tengo una situación en la que esta advertencia me está molestando muchísimo. En mi caso, estoy completando mi dict parcialmente como literales y parcialmente desde una salida de tupla por una función, así:

def get_other_values():
    return 3, 4

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

Entonces, a menos que cree vars provisionales para la salida de get_other_values, PEP8 genera esta advertencia a pesar de que estoy creando el dict con literales. Y no puedo asignar las teclas cyd en el literal, ya que los valores se muestran como una tupla.

Chris Woodfield
fuente