Avviso di cell-var-from-loop di Pylint


94

Per il seguente codice:

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

Pylint ha segnalato un errore:

Sort_key della variabile di cella definita in loop (cell-var-from-loop)

Qualcuno potrebbe dare un suggerimento su cosa sta succedendo qui? Dal codice sorgente di pylint la descrizione è:

Una variabile utilizzata in una chiusura è definita in un ciclo. Ciò comporterà che tutte le chiusure utilizzeranno lo stesso valore per la variabile di chiusura.

Ma non ho la più pallida idea di cosa significhi. Qualcuno potrebbe fornire un esempio del problema?


Che tipo di oggetto è results? Elenco ordinario? Qualcos'altro?
Kevin


@ Kevin, ad es. Risultati = [{chiave: valore}, {chiave: valore} ...]
xis

Ok. In tal caso, sono d'accordo con chepner sul fatto che non devi preoccuparti dell'avvertimento qui.
Kevin

Risposte:


106

Il nome sort_keynel corpo di lambdaverrà cercato quando la funzione viene effettivamente chiamata, quindi vedrà il valore sort_keyavuto più di recente. Poiché stai chiamando sortimmediatamente, il valore di sort_keynon cambierà prima che venga utilizzato l'oggetto funzione risultante, quindi puoi tranquillamente ignorare l'avviso. Per silenziarlo, puoi sort_keyimpostare il valore predefinito di un parametro su lambda:

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

5
Sbaglierei dalla parte di risolvere il problema invece di ignorare l'avvertimento. Se possibile, userei al key=partial(get_from_dot_path, foo=sort_key)posto dell'espressione lambda (supponendo che ci sia un nome di parametro foodefinito da get_from_dot_pathquello che puoi usare per un argomento di parola chiave; partialconsente solo di inserire i parametri posizionali esclusivamente da sinistra).
chepner

1
Ah, non sapevo che questo avrebbe risolto il problema, pensavo fossero equivalenti; in tal caso sono d'accordo.
timdiels

3
tieni presente che attualmente il trucco non funziona sempre github.com/PyCQA/pylint/issues/3107
Daniel Pinyol
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.