Advertencia de Cell-var-from-loop de Pylint


91

Para el siguiente código:

for sort_key, order in query_data['sort']:
    results.sort(key=lambda k: get_from_dot_path(k, sort_key),
                 reverse=(order == -1))

Pylint informó un error:

Variable de celda sort_key definida en bucle (cell-var-from-loop)

¿Alguien podría dar una pista de lo que está sucediendo aquí? Del código fuente de pylint, la descripción es:

Una variable utilizada en un cierre se define en un bucle. Esto dará como resultado que todos los cierres utilicen el mismo valor para la variable cerrada.

Pero no tengo ni idea de lo que significa. ¿Alguien podría dar un ejemplo del problema?


¿Qué tipo de objeto es results? Lista ordinaria? ¿Algo más?
Kevin


@Kevin, por ejemplo, resultados = [{clave: valor}, {clave: valor} ...]
x es el

Okay. En ese caso, estoy de acuerdo con Chepner en que no necesita preocuparse por la advertencia aquí.
Kevin

Respuestas:


102

El nombre sort_keyen el cuerpo de se lambdabuscará cuando se llame realmente a la función, por lo que verá el valor que sort_keytenía más recientemente. Dado que está llamando sortinmediatamente, el valor de sort_keyno cambiará antes de que se use el objeto de función resultante, por lo que puede ignorar la advertencia de manera segura. Para silenciarlo, puede establecer sort_keyel valor predeterminado de un parámetro en lambda:

results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk),
             reverse=(order == -1))

5
Me equivocaría por solucionar el problema en lugar de ignorar la advertencia. Si es posible, usaría en key=partial(get_from_dot_path, foo=sort_key)lugar de la expresión lambda (suponiendo que haya algún nombre de parámetro foodefinido por get_from_dot_pathque pueda usar para un argumento de palabra clave; partialsolo permite completar parámetros posicionales exclusivamente desde la izquierda).
chepner

1
Ah, no me di cuenta de que esto lo arreglaría, pensé que eran equivalentes; en ese caso estoy de acuerdo.
timdiels

3
tenga en cuenta que actualmente el truco no siempre funciona github.com/PyCQA/pylint/issues/3107
Daniel Pinyol
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.