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

5 minutos de lectura

avatar de usuario
chris sears

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

Esta creación de diccionario podría reescribirse como un diccionario literal.

si lo reescribo d = dict() la advertencia desaparece. Ya que {} ya es un diccionario literal, estoy bastante seguro de que el mensaje es erróneo. Además, parece que 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é Pycharm se quejaría de d = {}?

ACTUALIZAR:

Mac lo clavó. La advertencia en realidad se aplicó a varias líneas, no solo a la que estaba 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

  • demasiado ruidoso, y no hay una ganancia de rendimiento real, solo una inspección superflua más

    – deslumbrante

    14/01/2015 a las 18:10

  • Lo mismo sucede con las listas: a = [1]; a.append(2), probablemente porque a=[1, 2] es mas bonito….

    – clérigos

    16/09/2015 a las 21:02


  • sí. mensaje molesto todos esos subrayados por PyCharm incomodan a uno antes de ejecutar el programa.

    – RajkumarR

    11 de noviembre de 2015 a las 11:54


  • 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 siguiente línea.

    – Dudnikof

    5 de diciembre de 2016 a las 8:17


avatar de usuario
Mac

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

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

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

como podrías haber escrito

dic = {'aaa': 5}

Nota: El hecho de que el error desaparezca si usa la función no significa necesariamente que pycharm crea dict() es un literal. Simplemente podría significar que no se queja de:

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

  • 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 reales de rendimiento.

    – deslumbrante

    14 de enero de 2015 a las 18:09

  • En mi caso no es posible ese tipo de reescritura, ya que cada ítem de diccionario que se crea (excepto el primero) depende del ítem de diccionario anterior creado. 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 un diccionario literal. Supongo que tengo que usar el dic = dict() solución alterna…

    – Hola Adios

    10 de agosto de 2016 a las 13:37

  • @HelloGoodbye: sin conocer el problema que está tratando de resolver, no puedo expresar una opinión calificada, pero ¿ha considerado comenzar con d = { 'aaa': f1(something) } después d = f2(d) después d = f3(d) etc… O alternativamente d['bbb'] = f2(d), d['ccc'] = f3(d) …?

    – Mac

    10/08/2016 a las 21:15


  • La construcción que tengo es d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])etc.

    – Hola Adios

    11 de agosto de 2016 a las 7:47

  • @HelloGoodbye – Entonces, ¿por qué no fusionar los dos primeros con d = {'a': A} y luego mantener la secuencia como lo describiste?

    – Mac

    11 de agosto de 2016 a las 14:14

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

  • Vaya a Configuración -> Inspecciones -> Python
  • Desmarque “La creación del diccionario podría ser reescrita por diccionario literal”

  • 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

    5 de febrero de 2018 a las 10:42


para aquellos a quienes les gusta (como a mí) 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

  • Me estremezco. 🙁 Entonces, en realidad aumentó la cantidad de código y lo hizo menos claro y más lento solo para deshacerse de una advertencia en el editor que usa … No uso pycharm, pero supongo que hay algo tipo de cambio de configuración que deshabilitará la advertencia y le permitirá seguir codificando de forma pitónica. 🙂

    – Mac

    6 de enero de 2018 a las 14:48

  • @mac Estoy de acuerdo ahora. Yo era joven y estúpido) desde entonces he cambiado (un poco) y simplemente deshabilité esas advertencias

    – Igor.K

    11 de marzo de 2018 a las 21:07

  • ¡Jajaja! ¡Este debe ser el comentario de compensación de tiempo más memorable que he recibido! 😉

    – Mac

    11/03/2018 a las 21:20

avatar de usuario
Asnim P. Ansari

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

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

Tengo una situación en la que esta advertencia me está molestando muchísimo. En mi caso, estoy completando mi dictado parcialmente como literales y parcialmente a partir de 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 variables provisionales para la salida de get_other_values, PEP8 genera esta advertencia aunque esté creando el dict con literales. Y no puedo asignar las teclas c y d en el literal, ya que los valores se muestran como una tupla.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad