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?
results
? Lista ordinaria? ¿Algo más?Respuestas:
El nombre
sort_key
en el cuerpo de selambda
buscará cuando se llame realmente a la función, por lo que verá el valor quesort_key
tenía más recientemente. Dado que está llamandosort
inmediatamente, el valor desort_key
no 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 establecersort_key
el valor predeterminado de un parámetro enlambda
:results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk), reverse=(order == -1))
fuente
key=partial(get_from_dot_path, foo=sort_key)
lugar de la expresión lambda (suponiendo que haya algún nombre de parámetrofoo
definido porget_from_dot_path
que pueda usar para un argumento de palabra clave;partial
solo permite completar parámetros posicionales exclusivamente desde la izquierda).