Pregunta

Python se trata de escribir un código hermoso. Entonces, estaba corriendo pylint Para verificar la "bella" de mi código, cuando me encuentro con algo:

Variable no utilizada 'myVar1'

De esta parte de mi código:

for myvar1, myvar2 in mylist:
    # Do stuff just using myvar2

mylist es una lista de tuplas, así que estoy desenvolviendo las tuplas en dos variables (myvar1 y myvar2). Estoy definiendo esas dos variables solo para desenvolver la segunda, porque no necesito la otra.

Entonces, aquí está mi pregunta: ¿Hay alguna forma de decirle al intérprete que desenvuelva la tupla, pero no asalte la primera parte (por ejemplo)? En otros idiomas puedes hacer algo como:

for _, myvar in mylist:
    # Do stuff with myvar

o

for *, myvar in mylist:
    # Do stuff with myvar

Eso significa: No me importa la primera parte de la tupla, solo necesito la segunda.

NOTA: Sé que esta podría ser una opción para lo que estoy preguntando:

for mytuple in mylist:
    # Do stuff with mytuple[1]

Pero eso es mucho menos legible.

¿Fue útil?

Solución

Además de la respuesta de @Raymondhettinger: Pylint tampoco se queja de las variables no utilizadas si sus nombres comienzan con un solo bajo. Esto significa que puedes usar:

for _myvar1, myvar2 in mylist:

Obteniendo lo mejor de ambos mundos:

  • Sin advertencia de pylint,
  • e información sobre la estructura de registro

Esto también funciona para los prototipos de funciones / métodos y evita advertencias sobre los parámetros no utilizados, que a menudo puede obtener al derivar de una clase base en un marco OO.

Otros consejos

¿Intentaste alguno de estos?

for _, myvar in mylist:
    #Do stuff

Funciona bien en Python y es relativamente idiomático.

yo escribo for _, myvar2 in mylist Cuando quiero enfatizar eso solo myVar2 se usa.

Y escribo for myvar1, myvar2 in mylist Cuando quiero recordarle al lector (generalmente yo) cuál es la estructura de registro.

los _ El nombre es solo una convención de nombres para un valor desechable. El intérprete de Cpython hace la asignación variable para él como lo haría con cualquier otro nombre de variable (afortunadamente, * store_fast * es una operación muy barata). En contraste, el Intérprete de pypy identificará la asignación de variables no utilizadas como código muerto, por lo que obtiene la optimización de forma gratuita independientemente de cómo la escriba.

Si tiene curiosidad sobre cómo Cpython interpreta su código, el módulo puede proporcionar información útil:

>>> from dis import dis
>>> def f(lot):
        for _, var2 in lot:
            print var2


>>> dis(f)
  2           0 SETUP_LOOP              25 (to 28)
              3 LOAD_FAST                0 (lot)
              6 GET_ITER            
        >>    7 FOR_ITER                17 (to 27)
             10 UNPACK_SEQUENCE          2
             13 STORE_FAST               1 (_)
             16 STORE_FAST               2 (var2)

  3          19 LOAD_FAST                2 (var2)
             22 PRINT_ITEM          
             23 PRINT_NEWLINE       
             24 JUMP_ABSOLUTE            7
        >>   27 POP_BLOCK           
        >>   28 LOAD_CONST               0 (None)
             31 RETURN_VALUE 

Como han mencionado los otros carteles, las advertencias de pylint a veces puede ser inane. Si prefiere un nombre de variable corto en su código, simplemente ignore la queja de pylint. Como señaló Francis Avila, Pylint no debería quejarse del _ en este contexto.

Supongo que podrías hacer esto:

for myvar in (t[1] for t in mylist):
    pass

Pero, francamente, creo que deberías ignorar la advertencia de Pylint en este caso: es lo suficientemente hermoso y no causará ninguna confusión (por eso quieres belleza en primer lugar).

Yo diría que Python se trata de escribir legible Código: cualquier "belleza" es simplemente un efecto secundario.

El primer elemento de la tupla podría eliminarse así:

for myvar2 in zip(*mylist)[1]:
    # Do stuff with myvar2

Pero no estoy seguro de que realmente lo recomiendo. Personalmente, solo usaría:

for myvar1, myvar2 in mylist:
    # Do stuff with myvar2

... e ignora Pylint.

tu = [(12,'sea'),(478,'badada'),(789,'zut')]

for x,x in tu:
    print x

resultado

sea
badada
zut

!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top