¿Cómo puedo evitar declarar una variable no utilizada en una lista de comprensión?

3 minutos de lectura

Avatar de usuario de Ramy
rami

Si tengo una lista de comprensión (por ejemplo) como esta:

['' for x in myList]

Efectivamente, haciendo una nueva lista que tiene una cadena vacía para cada elemento en una lista, nunca uso el x. ¿Hay una forma más limpia de escribir esto para no tener que declarar lo que no se usa? x ¿variable?

  • Inspirándome en esta pregunta, creé un tutorial de YouTube que cubre las variables no utilizadas en las listas de comprensión. youtube.com/watch?v=cZb5aFcpsAs

    –Brendan Metcalfe

    7 de enero de 2021 a las 3:17

  • Importante: PEP 640: sintaxis de variables no utilizadas (actualmente en estado de “Borrador”), que propone permitir ? como marcador de posición.

    – 0 _

    13 de abril de 2021 a las 5:08

avatar de usuario de kennytm
kennytm

_ es un nombre de marcador de posición estándar para miembros ignorados en una asignación de tupla y bucle for, por ejemplo

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

Por cierto, su lista podría escribirse sin comprensión de lista (suponiendo que desea hacer una lista de miembros inmutables como cadenas, enteros, etc.).

[''] * len(myList)

  • Este último debe ir acompañado de una gran advertencia de que no hace lo esperado para los objetos mutables.

    usuario395760

    29 de marzo de 2011 a las 18:29

  • @Mohit: a=[[]]*4;a[0].append(5);print(a)

    – kennytm

    29 de marzo de 2011 a las 18:32

  • @Ramy: Mohit publicó una explicación pero fue eliminada :S De todos modos, revisa las Notas 2 en docs.python.org/py3k/library/….

    – kennytm

    30 de marzo de 2011 a las 6:52

  • @Ramy, Python mantiene la misma referencia para el mismo objeto en la memoria.

    –Mohit Ranka

    30 de marzo de 2011 a las 9:13

  • @EricAuld no importa, el ciclo for no depende del nombre de la variable (for i in range(3): for i in range(3): print('.') siempre imprimirá 9 puntos). La variable interna seguramente sombreará la externa, pero se supone que no debes leer _.

    – kennytm

    27 de julio de 2018 a las 3:56

No. Como dice el Zen: los casos especiales no son lo suficientemente especiales como para romper las reglas. El caso especial son los bucles que no usan los elementos de la cosa que se está iterando y la regla es que hay un “objetivo” para desempaquetar.

Sin embargo, puede utilizar _ como nombre de variable, que generalmente se entiende como “intencionalmente no utilizado” (incluso PyLint, etc. lo sabe y lo respeta).

  • PyLint sin embargo se queja de que C: 10,24: Invalid variable name "_" (invalid-name) a menos que lo añadas good-names en tus .pylintrc.

    – giorgiosironi

    8 de junio de 2016 a las 8:22

Avatar de usuario de Alfred
Alfredo

Resulta que usando dummy* (la palabra inicial es ficticia) ya que el nombre de la variable hace el mismo truco que _. _ es un estándar conocido y sería mejor usar nombres de variables significativos. Entonces puedes usar dummy, dummy1, dummy_anything. Usando estos nombres de variables PyLint no se quejará

  • De hecho, prefiero este enfoque. sigue siendo significativo.

    – RvdK

    19 de febrero de 2018 a las 7:45

Agregue el siguiente comentario después del bucle for en la misma línea:

#pylint: disabled=variable no utilizada

for i in range(100): #pylint: disable=unused-variable

Si necesita nombrar sus argumentos (por ejemplo, al escribir simulacros que no usan ciertos argumentos a los que se hace referencia por nombre), puede agregar este método abreviado:

def UnusedArgument(_):
  pass

y luego usarlo así

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

avatar de usuario de highBandWidth
ancho de banda alto

Los objetos generadores en realidad no usan las variables. Entonces algo como

list(('' for x in myList))

debería hacer el truco. Tenga en cuenta que x no se define como una variable fuera de la comprensión del generador.

Avatar de usuario de Adam Scharf
Adán Scharf

También puede anteponer un nombre de variable con _ si prefiere darle a la variable un nombre legible por humanos. Por ejemplo, puedes usar _foo, _foo1, _anything y PyLint no se quejará. En un bucle for, sería como:

for _something in range(10):
    do_something_else()

editar: Agregar ejemplo

¿Ha sido útil esta solución?