web-dev-qa-db-fra.com

Avertissement Cell-var-from-loop de Pylint

Pour le code suivant:

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

Pylint a signalé une erreur:

Variable de cellule sort_key définie dans la boucle (cell-var-from-loop)

Quelqu'un pourrait-il donner un indice de ce qui se passe ici? Du code source pylint la description est:

Une variable utilisée dans une fermeture est définie dans une boucle. Cela entraînera toutes les fermetures utilisant la même valeur pour la variable fermée.

Mais je n'ai aucune idée de ce que cela signifie. Quelqu'un pourrait-il donner un exemple du problème?

62
xis

Le nom sort_key dans le corps de lambda sera recherché lors de l'appel de la fonction, il verra donc la valeur sort_key avait plus récemment. Puisque vous appelez sort immédiatement, la valeur de sort_key ne changera pas avant que l'objet fonction résultant ne soit utilisé, vous pouvez donc ignorer l'avertissement en toute sécurité. Pour le faire taire, vous pouvez faire sort_key la valeur par défaut d'un paramètre à lambda:

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